[
  {
    "path": ".github/FUNDING.yml",
    "content": "github: mrzachnugent\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: '[ BUG ]'\nlabels: bug\nassignees: ''\n---\n\n<!--\n\n⚠️ **Important**: Issues must include a valid reproduction link. Reports without one will be automatically closed.\n\nYou can quickly create a minimal reproduction using:\n\n```bash\nnpx @react-native-reusables/cli@latest init -t minimal\n```\n\n-->\n\n**Reproduction link**: `<link>`\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**Steps to reproduce the behavior:**\n\n1. Start the '...' app with '...'\n2. Go to '...'\n3. Click on '....'\n4. Scroll down to '....'\n5. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Platform (please complete the following information):**\n\n- Type: [eg: Browser, Simulator, Emulator, Device]\n- OS: [e.g. iOS]\n- Browser (if applies) [e.g. chrome, safari]\n\n**CLI output (paste the full command output)**\n\nIf applicable, paste the full command output by running it with the `--log-level all` flag.\n\n```bash\nnpx @react-native-reusables/cli@latest --log-level all [command] [args] [options]\n\n// example:\n// npx @react-native-reusables/cli@latest --log-level all init -t minimal\n```\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "# Pull Request Template\n\n<!--\n\n⚠️ **Important**\n\n**If you want to propose a new feature:**\n\n1.  Make sure to read the [project scope](https://github.com/founded-labs/react-native-reusables/discussions/229) to confirm your proposal fits within the vision and purpose of `react-native-reusables`.\n2. Before taking any action, please open a [new discussion](https://github.com/founded-labs/react-native-reusables/discussions). This allows us to collaborate, gather feedback, and ensure alignment with the project's goals.\n\n-->\n\n## Description:\n\n<!-- Provide a brief description of the changes introduced by this pull request. -->\n\nFixes issue #<!-- Add the issue number that this PR fixes, if applicable. -->\n\n## Tested Platforms:\n\n<!-- Check the platforms that you have tested this PR on. -->\n\n- [ ] Web\n- [ ] iOS\n- [ ] Android\n\n## Affected Apps/Packages:\n\n<!-- Specify which apps or packages are affected by this pull request. -->\n\n- [ ] apps/docs\n- [ ] apps/showcase\n- [ ] apps/cli\n- [ ] packages/registry\n\n### Screenshots:\n\n<!-- If applicable, add screenshots to showcase the changes visually. -->\n\n#### Notes:\n\n<!-- Add any additional notes or context that reviewers should be aware of. -->\n"
  },
  {
    "path": ".gitignore",
    "content": "# Monorepo\napps/*/credentials.json\napps/*/build\npackages/*/build\n\n# Turborepo\n.turbo\n\n# Expo\n.expo\n__generated__\nweb-build\nexpo-env.d.ts\n\npackages/experimental\n\n# macOS\n.DS_Store\n\n# Node\nnode_modules\nnpm-debug.log\nyarn-error.log\npackage-lock.json\n\n# Ruby\n.direnv\n\n# Emacs\n*~\n\n# Vim\n.*.swp\n.*.swo\n.*.swn\n.*.swm\n\n# Sublime Text\n*.sublime-project\n*.sublime-workspace\n\n# Xcode\n*.pbxuser\n!default.pbxuser\n*.xccheckout\n*.xcscmblueprint\nxcuserdata\n\n# Android Studio\n*.iml\n.gradle\n.idea/libraries\n.idea/workspace.xml\n.idea/gradle.xml\n.idea/misc.xml\n.idea/modules.xml\n.idea/vcs.xml\n\n# Eclipse\n.project\n.settings\n\n# VSCode\n.history/\n"
  },
  {
    "path": ".npmrc",
    "content": "node-linker=hoisted"
  },
  {
    "path": ".nvmrc",
    "content": "20.11"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"printWidth\": 100,\n  \"tabWidth\": 2,\n  \"singleQuote\": true,\n  \"bracketSameLine\": true,\n  \"trailingComma\": \"es5\",\n  \"plugins\": [\"prettier-plugin-tailwindcss\"],\n  \"tailwindFunctions\": [\"cva\"]\n}\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n- Demonstrating empathy and kindness toward other people\n- Being respectful of differing opinions, viewpoints, and experiences\n- Giving and gracefully accepting constructive feedback\n- Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n- Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n- The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n- Trolling, insulting or derogatory comments, and personal or political attacks\n- Public or private harassment\n- Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n- Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\nhello@foundedlabs.com.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "COMMUNITY_RESOURCES.md",
    "content": "# Community Resources\n\nCommunity-created components, libraries, and templates that extend React Native Reusables and fill in missing shadcn/ui elements.\n\n_Contributions are welcome! Submit a PR to add your resource._\n\n## Components & Libraries\n\n### Calendar\n\n- [React Native Flash Calendar](https://github.com/MarceloPrado/flash-calendar)  \n  Incredibly fast and flexible library to build calendars in React Native.\n\n### Carousel\n\n- [Animated.ScrollView](https://medium.com/timeless/building-a-gallery-carousel-in-react-native-using-reanimated-i-19b19e6b6b10)  \n  Article explaining how to create a carousel using the ScrollView component.\n\n### Chart\n\n- [Victory Native](https://github.com/FormidableLabs/victory-native-xl)  \n  Charting library for React Native with a focus on performance and customization.\n\n### Combobox\n\n_TBD_\n\n### Command\n\n_TBD_\n\n### Data Table\n\n- [Tanstack Table](https://tanstack.com/table/latest)  \n  Headless UI for building powerful tables and datagrids.\n\n### Date Picker\n\n- [React Native DateTimePicker](https://github.com/react-native-datetimepicker/datetimepicker)  \n  Date and time picker component for iOS, Android, and Windows.\n\n### Drawer\n\n- [Universal Bottom Sheet](https://github.com/adebayoileri/universal-bottom-sheet) by [adebayoileri](https://github.com/adebayoileri)  \n  Bottom sheet component that combines Gorhom Bottom Sheet and Vaul for a seamless, responsive experience across mobile and web.\n\n### Form\n\n- [React Hook Form](https://react-hook-form.com/get-started#ReactNative)  \n  Performant, flexible, and extensible forms with easy-to-use validation.\n\n### Input OTP\n\n- [input-otp-native](https://github.com/yjose/input-otp-native)  \n  🔐 OTP input for React Native/Expo apps: unstyled, copy-paste examples that are fully tested and compatible with Nativewind.\n\n### Resizable\n\n_TBD_\n\n### Scroll Area\n\n- [React Native ScrollView](https://reactnative.dev/docs/scrollview)  \n  Generic scrolling container that can host multiple components and views.\n\n### Sheet (Drawer Navigation)\n\n- [Drawer Navigation](https://reactnavigation.org/docs/drawer-based-navigation/)  \n  Drawer navigation component that slides in from the side.\n\n### Sonner\n\n- [Sonner Native](https://github.com/gunnartorfis/sonner-native) by [gunnartorfis](https://github.com/gunnartorfis)  \n  Opinionated toast component for React Native. Port of @emilkowalski's sonner.\n\n- [Burnt](https://www.npmjs.com/package/burnt)  \n  Cross-platform toasts for React Native, powered by native elements. Uses [Sonner](https://github.com/emilkowalski/sonner) on Web.\n\n---\n\n## Templates\n\n- [RNR Base Bare](https://github.com/a0m0rajab/rnr-base-bare) by [a0m0rajab](https://github.com/a0m0rajab)  \n  Supabase-powered starter app with sign-in, sign-up, and profile functionality.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to React Native Reusables\n\nThank you for your interest in contributing to `react-native-reusables`! We welcome contributions from the community to improve and enhance this project. Before getting started, please take a moment to review the following guidelines.\n\n## How to Contribute\n\n> ⚠️ **Important**\n>\n> If you want to propose a new feature:\n>\n> 1.  Make sure to read the [project scope](https://github.com/founded-labs/react-native-reusables/discussions/229) to confirm your proposal fits within the vision and purpose of `react-native-reusables`.\n> 2.  Before taking any action, please open a [new discussion](https://github.com/founded-labs/react-native-reusables/discussions). This allows us to collaborate, gather feedback, and ensure alignment with the project's goals.\n\n<br />\n\n1. Fork the repository to your GitHub account.\n2. Clone the forked repository to your local machine:\n   ```bash\n   git clone https://github.com/your-username/react-native-reusables.git\n   cd react-native-reusables\n   ```\n3. Create a new branch:\n\n   ```bash\n   git checkout -b your-username/your-feature-name\n   ```\n\n4. Make your changes and ensure that your code adheres to the existing coding standards.\n5. Commit your changes with clear and concise commit messages:\n\n```bash\ngit commit -m \"Add your commit message here\"\n```\n\n6. Push your changes to your forked repository:\n\n   ```bash\n   git push origin your-username/your-feature-name\n   ```\n\n7. Open a pull request (PR) against the main branch of the original repository.\n\n## Code Style Guidelines\n\nPlease follow the coding style and guidelines used in the project. If there are specific coding conventions, linting rules, or documentation standards, make sure your contributions adhere to them.\n\n> _If they are not clear, please create an issue and we will create a CODING_STYLE_GUIDELINE.md_\n\n## Issue Tracker\n\nCheck the [issue tracker](https://github.com/founded-labs/react-native-reusables/issues) for existing issues or open a new issue to discuss and coordinate your contribution with the maintainers.\n\n## Code of Conduct\n\nPlease review and adhere to our [Code of Conduct](https://github.com/founded-labs/react-native-reusables/blob/main/CODE_OF_CONDUCT.md). Be respectful and considerate towards others.\n\n## License\n\nBy contributing to this project, you agree that your contributions will be licensed under the [LICENSE](https://github.com/founded-labs/react-native-reusables/blob/main/LICENSE) file of this repository.\n\n## Contact\n\nIf you have any questions or need further assistance, feel free to contact us at hello@foundedlabs.com.\n\n**We appreciate your contributions and look forward to working with you!**\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2025 Founded Labs\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": "# React Native Reusables\n\nBringing [shadcn/ui](https://ui.shadcn.com) to React Native. Beautifully crafted components with [Nativewind](https://www.nativewind.dev/), open source, and almost as easy to use.</i>\n\n![hero](apps/docs/public/og.png)\n\n## Documentation\n\nVisit https://reactnativereusables.com/docs to view the documentation.\n\n## Community Resources\n\nSee the [community resources](./COMMUNITY_RESOURCES.md) for community-maintained components, libraries, and templates.\n\n## Contributing\n\nPlease read the [contributing guide](/CONTRIBUTING.md).\n\n## License\n\nLicensed under the [MIT license](/LICENSE).\n\n<br />\n<br />\n<a href=\"https://vercel.com/oss\">\n  <img alt=\"Vercel OSS Program\" src=\"https://vercel.com/oss/program-badge.svg\" />\n</a>\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Reporting a Security Issue\n\nIf you discover a security issue in this repository, please help us by responsibly disclosing it to us. We appreciate your efforts and will work with you to address and resolve the problem.\n\nPlease follow these guidelines when reporting security issues:\n\n### Responsible Disclosure\n\n1. **Do not create public issues for security-related concerns.**\n2. Email us at [hello@foundedlabs.com](mailto:hello@foundedlabs.com) with details about the issue.\n3. Allow us a reasonable amount of time to address the issue before disclosing it publicly.\n\n### Information to Include\n\nWhen reporting a security issue, please provide the following information:\n\n- Description of the issue, including steps to reproduce.\n- Any specific details or context that can help us understand and address the problem.\n- Your contact information for further communication.\n\n## Code Copy-Pasting Disclaimer\n\nThis repository allows users to copy and paste code snippets. While we aim to ensure the security of the code, users are responsible for reviewing and using the code responsibly in their own projects. The repository maintainers are not liable for any security vulnerabilities or issues that may arise from code usage.\n\n## Updates and Security Notices\n\nSecurity updates and notices related to this repository will be communicated through the repository's README or other appropriate channels. Users are encouraged to stay informed about security-related announcements.\n\n## Support\n\nIf you have any questions or need further assistance, you can reach out to us at [hello@foundedlabs.com](mailto:hello@foundedlabs.com).\n\nThank you for helping us keep this repository secure!\n"
  },
  {
    "path": "apps/cli/.changeset/config.json",
    "content": "{\n  \"$schema\": \"https://unpkg.com/@changesets/config@3.0.2/schema.json\",\n  \"changelog\": [\n    \"@changesets/changelog-github\",\n    {\n      \"repo\": \"founded-labs/react-native-reusables\"\n    }\n  ],\n  \"commit\": false,\n  \"fixed\": [],\n  \"linked\": [],\n  \"access\": \"restricted\",\n  \"baseBranch\": \"main\",\n  \"updateInternalDependencies\": \"patch\",\n  \"ignore\": []\n}\n"
  },
  {
    "path": "apps/cli/.github/actions/setup/action.yml",
    "content": "name: Setup\ndescription: Perform standard setup and install dependencies using pnpm.\ninputs:\n  node-version:\n    description: The version of Node.js to install\n    required: true\n    default: 20.16.0\n\nruns:\n  using: composite\n  steps:\n    - name: Install pnpm\n      uses: pnpm/action-setup@v3\n    - name: Install node\n      uses: actions/setup-node@v4\n      with:\n        cache: pnpm\n        node-version: ${{ inputs.node-version }}\n    - name: Install dependencies\n      shell: bash\n      run: pnpm install\n"
  },
  {
    "path": "apps/cli/.github/workflows/check.yml",
    "content": "name: Check\n\non:\n  workflow_dispatch:\n  pull_request:\n    branches: [main]\n  push:\n    branches: [main]\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\npermissions: {}\n\njobs:\n  build:\n    name: Build\n    runs-on: ubuntu-latest\n    timeout-minutes: 10\n    steps:\n      - uses: actions/checkout@v4\n      - name: Install dependencies\n        uses: ./.github/actions/setup\n\n  types:\n    name: Types\n    runs-on: ubuntu-latest\n    timeout-minutes: 10\n    steps:\n      - uses: actions/checkout@v4\n      - name: Install dependencies\n        uses: ./.github/actions/setup\n      - run: pnpm check\n\n  lint:\n    name: Lint\n    runs-on: ubuntu-latest\n    timeout-minutes: 10\n    steps:\n      - uses: actions/checkout@v4\n      - name: Install dependencies\n        uses: ./.github/actions/setup\n      - run: pnpm lint\n\n  test:\n    name: Test\n    runs-on: ubuntu-latest\n    timeout-minutes: 10\n    steps:\n      - uses: actions/checkout@v4\n      - name: Install dependencies\n        uses: ./.github/actions/setup\n      - run: pnpm test\n"
  },
  {
    "path": "apps/cli/.github/workflows/release.yml",
    "content": ""
  },
  {
    "path": "apps/cli/.github/workflows/snapshot.yml",
    "content": "name: Snapshot\n\non:\n  pull_request:\n    branches: [main, next-minor, next-major]\n  workflow_dispatch:\n\npermissions: {}\n\njobs:\n  snapshot:\n    name: Snapshot\n    if: github.repository_owner == 'Effect-Ts'\n    runs-on: ubuntu-latest\n    timeout-minutes: 10\n    steps:\n      - uses: actions/checkout@v4\n      - name: Install dependencies\n        uses: ./.github/actions/setup\n      - name: Build package\n        run: pnpm build\n      - name: Create snapshot\n        id: snapshot\n        run: pnpx pkg-pr-new@0.0.24 publish --pnpm --comment=off\n"
  },
  {
    "path": "apps/cli/.gitignore",
    "content": "coverage/\n*.tsbuildinfo\nnode_modules/\nyarn-error.log\n.ultra.cache.json\n.DS_Store\ntmp/\nbuild/\ndist/\n.direnv/\n.env\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n"
  },
  {
    "path": "apps/cli/.prettierrc",
    "content": "{\n  \"tabWidth\": 2,\n  \"printWidth\": 120,\n  \"semi\": false,\n  \"singleQuote\": false,\n  \"trailingComma\": \"none\",\n  \"arrowParens\": \"always\"\n}\n"
  },
  {
    "path": "apps/cli/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"effectful-tech.effect-vscode\",\n    \"dbaeumer.vscode-eslint\"\n  ]\n}"
  },
  {
    "path": "apps/cli/.vscode/settings.json",
    "content": "{\n  \"typescript.tsdk\": \"node_modules/typescript/lib\",\n  \"typescript.preferences.importModuleSpecifier\": \"relative\",\n  \"typescript.enablePromptUseWorkspaceTsdk\": true,\n  \"editor.formatOnSave\": true,\n  \"eslint.format.enable\": true,\n  \"[json]\": {\n    \"editor.defaultFormatter\": \"vscode.json-language-features\"\n  },\n  \"[markdown]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n    \"prettier.semi\": false,\n    \"prettier.trailingComma\": \"none\"\n  },\n  \"[javascript]\": {\n    \"editor.defaultFormatter\": \"dbaeumer.vscode-eslint\"\n  },\n  \"[javascriptreact]\": {\n    \"editor.defaultFormatter\": \"dbaeumer.vscode-eslint\"\n  },\n  \"[typescript]\": {\n    \"editor.defaultFormatter\": \"dbaeumer.vscode-eslint\"\n  },\n  \"[typescriptreact]\": {\n    \"editor.defaultFormatter\": \"dbaeumer.vscode-eslint\"\n  },\n  \"eslint.validate\": [\"markdown\", \"javascript\", \"typescript\"],\n  \"editor.codeActionsOnSave\": {\n    \"source.fixAll.eslint\": \"explicit\"\n  },\n  \"editor.quickSuggestions\": {\n    \"other\": true,\n    \"comments\": false,\n    \"strings\": false\n  },\n  \"editor.acceptSuggestionOnCommitCharacter\": true,\n  \"editor.acceptSuggestionOnEnter\": \"on\",\n  \"editor.quickSuggestionsDelay\": 10,\n  \"editor.suggestOnTriggerCharacters\": true,\n  \"editor.tabCompletion\": \"off\",\n  \"editor.suggest.localityBonus\": true,\n  \"editor.suggestSelection\": \"recentlyUsed\",\n  \"editor.wordBasedSuggestions\": \"matchingDocuments\",\n  \"editor.parameterHints.enabled\": true,\n  \"files.insertFinalNewline\": true\n}\n"
  },
  {
    "path": "apps/cli/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2024-present Founded Labs\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": "apps/cli/README.md",
    "content": "# React Native Reusables CLI\n\nA command-line toolkit to streamline the integration, setup, and maintenance of reusable React Native components in your projects.\n\n## Features\n\n- **Add**: Quickly add reusable React Native components to your project, with style and path options.\n- **Doctor**: Diagnose your project for missing files, misconfigurations, and required dependencies. Optionally auto-install missing dependencies.\n- **Init**: Bootstrap a new React Native project pre-configured for reusables, or inspect/repair an existing setup.\n\n## Getting Started\n\n### Installation\n\nYou can run the CLI directly with your favorite package manager:\n\n```sh\nnpx @react-native-reusables/cli@latest <command>\npnpm dlx @react-native-reusables/cli@latest <command>\nyarn dlx @react-native-reusables/cli@latest <command>\nbunx --bun @react-native-reusables/cli@latest <command>\n```\n\n## Commands\n\n---\n\n### `@react-native-reusables/cli@latest add [options] [components...]`\n\nAdd one or more React Native components to your project.\n\n| Argument   | Description                                                                   |\n| ---------- | ----------------------------------------------------------------------------- |\n| components | Name of component(s) to add. (e.g. `button`, `input`, `card`, `avatar`, etc.) |\n\n| Option              | Description                          | Default         |\n| ------------------- | ------------------------------------ | --------------- |\n| `-y, --yes`         | Skip confirmation prompts.           | false           |\n| `-o, --overwrite`   | Overwrite existing files.            | false           |\n| `-c, --cwd <cwd>`   | The working directory.               | . (current dir) |\n| `-a, --all`         | Add all available components.        | false           |\n| `-p, --path <path>` | The path to add the component(s) to. |                 |\n| `--styling-library <styling-library>` | Override detected styling library (`nativewind` or `uniwind`). | auto-detect |\n| `-h, --help`        | Display help for command.            |                 |\n\n---\n\n### `rnr doctor [options]`\n\nCheck your project setup and diagnose issues.\n\n| Option            | Description                                            | Default         |\n| ----------------- | ------------------------------------------------------ | --------------- |\n| `-y, --yes`       | Skip confirmation prompts for installing dependencies. | false           |\n| `-c, --cwd <cwd>` | The working directory.                                 | . (current dir) |\n| `--summary`       | Output a summary only.                                 | false           |\n| `-h, --help`      | Display help for command.                              |                 |\n\n---\n\n### `rnr init [options]`\n\nInitialize a new React Native project with reusables.\n\n| Option            | Description               | Default         |\n| ----------------- | ------------------------- | --------------- |\n| `-c, --cwd <cwd>` | The working directory.    | . (current dir) |\n| `-h, --help`      | Display help for command. |                 |\n\n---\n\n## Development\n\n### Scripts\n\n- `pnpm build` – Build the CLI for production.\n- `pnpm dev` – Run the CLI in development mode.\n\n> **Note:** If you are developing locally and want to use the `add` command in development mode, you must have the `apps/docs` app running. Start it from the root with:\n>\n> ```sh\n> pnpm dev:docs\n> ```\n>\n> This serves the component registry required for local development.\n\n### Structure\n\n- `src/cli.ts` – Main CLI entrypoint and command definitions.\n- `src/bin.ts` – Node boot-strapper.\n- `src/services/commands/` – Command implementations (`add`, `doctor`, `init`).\n- `src/contexts/` – CLI option/context definitions.\n- `src/utils/` – Utility functions.\n\n## Contributing\n\nSee the [main repo README](../../README.md) for guidelines.\n"
  },
  {
    "path": "apps/cli/eslint.config.mjs",
    "content": "import { fixupPluginRules } from \"@eslint/compat\"\nimport { FlatCompat } from \"@eslint/eslintrc\"\nimport js from \"@eslint/js\"\nimport tsParser from \"@typescript-eslint/parser\"\nimport codegen from \"eslint-plugin-codegen\"\nimport _import from \"eslint-plugin-import\"\nimport simpleImportSort from \"eslint-plugin-simple-import-sort\"\nimport sortDestructureKeys from \"eslint-plugin-sort-destructure-keys\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\nconst compat = new FlatCompat({\n  baseDirectory: __dirname,\n  recommendedConfig: js.configs.recommended,\n  allConfig: js.configs.all\n})\n\nexport default [\n  {\n    ignores: [\"**/dist\", \"**/build\", \"**/docs\", \"**/*.md\"]\n  },\n  ...compat.extends(\n    \"eslint:recommended\",\n    \"plugin:@typescript-eslint/eslint-recommended\",\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:@effect/recommended\"\n  ),\n  {\n    plugins: {\n      import: fixupPluginRules(_import),\n      \"sort-destructure-keys\": sortDestructureKeys,\n      \"simple-import-sort\": simpleImportSort,\n      codegen\n    },\n\n    languageOptions: {\n      parser: tsParser,\n      ecmaVersion: 2018,\n      sourceType: \"module\"\n    },\n\n    settings: {\n      \"import/parsers\": {\n        \"@typescript-eslint/parser\": [\".ts\", \".tsx\"]\n      },\n\n      \"import/resolver\": {\n        typescript: {\n          alwaysTryTypes: true\n        }\n      }\n    },\n\n    rules: {\n      \"codegen/codegen\": \"error\",\n      \"no-fallthrough\": \"off\",\n      \"no-irregular-whitespace\": \"off\",\n      \"object-shorthand\": \"error\",\n      \"prefer-destructuring\": \"off\",\n      \"sort-imports\": \"off\",\n\n      \"no-restricted-syntax\": [\n        \"error\",\n        {\n          selector: \"CallExpression[callee.property.name='push'] > SpreadElement.arguments\",\n          message: \"Do not use spread arguments in Array.push\"\n        }\n      ],\n\n      \"no-unused-vars\": \"off\",\n      \"prefer-rest-params\": \"off\",\n      \"prefer-spread\": \"off\",\n      \"import/first\": \"error\",\n      \"import/newline-after-import\": \"error\",\n      \"import/no-duplicates\": \"error\",\n      \"import/no-unresolved\": \"off\",\n      \"import/order\": \"off\",\n      \"simple-import-sort/imports\": \"off\",\n      \"sort-destructure-keys/sort-destructure-keys\": \"error\",\n      \"deprecation/deprecation\": \"off\",\n\n      \"@typescript-eslint/array-type\": [\n        \"warn\",\n        {\n          default: \"generic\",\n          readonly: \"generic\"\n        }\n      ],\n\n      \"@typescript-eslint/member-delimiter-style\": 0,\n      \"@typescript-eslint/no-non-null-assertion\": \"off\",\n      \"@typescript-eslint/ban-types\": \"off\",\n      \"@typescript-eslint/no-explicit-any\": \"off\",\n      \"@typescript-eslint/no-empty-interface\": \"off\",\n      \"@typescript-eslint/consistent-type-imports\": \"warn\",\n\n      \"@typescript-eslint/no-unused-vars\": [\n        \"error\",\n        {\n          argsIgnorePattern: \"^_\",\n          varsIgnorePattern: \"^_\"\n        }\n      ],\n\n      \"@typescript-eslint/ban-ts-comment\": \"off\",\n      \"@typescript-eslint/camelcase\": \"off\",\n      \"@typescript-eslint/explicit-function-return-type\": \"off\",\n      \"@typescript-eslint/explicit-module-boundary-types\": \"off\",\n      \"@typescript-eslint/interface-name-prefix\": \"off\",\n      \"@typescript-eslint/no-array-constructor\": \"off\",\n      \"@typescript-eslint/no-use-before-define\": \"off\",\n      \"@typescript-eslint/no-namespace\": \"off\",\n      \"@effect/dprint\": \"off\"\n    }\n  }\n]\n"
  },
  {
    "path": "apps/cli/package.json",
    "content": "{\n  \"name\": \"@react-native-reusables/cli\",\n  \"version\": \"0.7.1\",\n  \"type\": \"module\",\n  \"license\": \"MIT\",\n  \"description\": \"A CLI for React Native Reusables\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/founded-labs/react-native-reusables.git\",\n    \"directory\": \"apps/cli\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"directory\": \"dist\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup && pnpm copy-package-json\",\n    \"build:ts\": \"tsup\",\n    \"clean\": \"rimraf dist/*\",\n    \"check\": \"tsc -b tsconfig.json\",\n    \"dev\": \"INTERNAL_ENV=development tsx src/bin.ts\",\n    \"lint\": \"eslint \\\"**/{src,test,examples,scripts,dtslint}/**/*.{ts,mjs}\\\"\",\n    \"lint-fix\": \"pnpm lint --fix\",\n    \"test\": \"vitest run\",\n    \"coverage\": \"vitest run --coverage\",\n    \"copy-package-json\": \"tsx scripts/copy-package-json.ts\",\n    \"changeset-version\": \"changeset version && node scripts/version.mjs\",\n    \"changeset-publish\": \"pnpm build && TEST_DIST= pnpm vitest && changeset publish\",\n    \"pub:beta\": \"pnpm publish --no-git-checks --access public --tag beta\",\n    \"pub:next\": \"pnpm publish --no-git-checks --access public --tag next\",\n    \"pub:release\": \"pnpm publish --access public\"\n  },\n  \"dependencies\": {\n    \"tsconfig-paths\": \"^4.2.0\"\n  },\n  \"devDependencies\": {\n    \"@changesets/changelog-github\": \"^0.5.0\",\n    \"@changesets/cli\": \"^2.27.8\",\n    \"@effect/cli\": \"latest\",\n    \"@effect/eslint-plugin\": \"^0.2.0\",\n    \"@effect/language-service\": \"^0.1.0\",\n    \"@effect/platform\": \"latest\",\n    \"@effect/platform-node\": \"latest\",\n    \"@effect/vitest\": \"latest\",\n    \"@eslint/compat\": \"1.1.1\",\n    \"@eslint/eslintrc\": \"3.1.0\",\n    \"@eslint/js\": \"9.10.0\",\n    \"@types/node\": \"22.10.5\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.4.0\",\n    \"@typescript-eslint/parser\": \"^8.4.0\",\n    \"effect\": \"latest\",\n    \"eslint\": \"^9.10.0\",\n    \"eslint-import-resolver-typescript\": \"^3.6.3\",\n    \"eslint-plugin-codegen\": \"0.28.0\",\n    \"eslint-plugin-deprecation\": \"^3.0.0\",\n    \"eslint-plugin-import\": \"^2.30.0\",\n    \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n    \"eslint-plugin-sort-destructure-keys\": \"^2.0.0\",\n    \"execa\": \"^7.2.0\",\n    \"log-symbols\": \"^7.0.1\",\n    \"ora\": \"^6.1.2\",\n    \"package-manager-detector\": \"^1.3.0\",\n    \"tsup\": \"^8.2.4\",\n    \"tsx\": \"^4.19.1\",\n    \"typescript\": \"^5.9.3\",\n    \"vitest\": \"^2.0.5\"\n  },\n  \"pnpm\": {\n    \"patchedDependencies\": {\n      \"@changesets/get-github-info@0.6.0\": \"patches/@changesets__get-github-info@0.6.0.patch\"\n    }\n  }\n}\n"
  },
  {
    "path": "apps/cli/patches/@changesets__get-github-info@0.6.0.patch",
    "content": "diff --git a/dist/changesets-get-github-info.cjs.js b/dist/changesets-get-github-info.cjs.js\nindex a74df59f8a5988f458a3476087399f5e6dfe4818..ce5e60ef9916eb0cb76ab1e9dd422abcad752bf6 100644\n--- a/dist/changesets-get-github-info.cjs.js\n+++ b/dist/changesets-get-github-info.cjs.js\n@@ -251,18 +251,13 @@ async function getInfo(request) {\n     b = new Date(b.mergedAt);\n     return a > b ? 1 : a < b ? -1 : 0;\n   })[0] : null;\n-\n-  if (associatedPullRequest) {\n-    user = associatedPullRequest.author;\n-  }\n-\n   return {\n     user: user ? user.login : null,\n     pull: associatedPullRequest ? associatedPullRequest.number : null,\n     links: {\n       commit: `[\\`${request.commit.slice(0, 7)}\\`](${data.commitUrl})`,\n       pull: associatedPullRequest ? `[#${associatedPullRequest.number}](${associatedPullRequest.url})` : null,\n-      user: user ? `[@${user.login}](${user.url})` : null\n+      user: user ? `@${user.login}` : null\n     }\n   };\n }\ndiff --git a/dist/changesets-get-github-info.esm.js b/dist/changesets-get-github-info.esm.js\nindex 27e5c972ab1202ff16f5124b471f4bbcc46be2b5..3940a8fe86e10cb46d8ff6436dea1103b1839927 100644\n--- a/dist/changesets-get-github-info.esm.js\n+++ b/dist/changesets-get-github-info.esm.js\n@@ -242,18 +242,13 @@ async function getInfo(request) {\n     b = new Date(b.mergedAt);\n     return a > b ? 1 : a < b ? -1 : 0;\n   })[0] : null;\n-\n-  if (associatedPullRequest) {\n-    user = associatedPullRequest.author;\n-  }\n-\n   return {\n     user: user ? user.login : null,\n     pull: associatedPullRequest ? associatedPullRequest.number : null,\n     links: {\n       commit: `[\\`${request.commit.slice(0, 7)}\\`](${data.commitUrl})`,\n       pull: associatedPullRequest ? `[#${associatedPullRequest.number}](${associatedPullRequest.url})` : null,\n-      user: user ? `[@${user.login}](${user.url})` : null\n+      user: user ? `@${user.login}` : null\n     }\n   };\n }\n"
  },
  {
    "path": "apps/cli/scripts/copy-package-json.ts",
    "content": "import { FileSystem, Path } from \"@effect/platform\"\nimport { NodeContext } from \"@effect/platform-node\"\nimport { Effect } from \"effect\"\n\nconst program = Effect.gen(function* () {\n  const fs = yield* FileSystem.FileSystem\n  const path = yield* Path.Path\n  yield* Effect.log(\"[Build] Copying package.json ...\")\n  const json: any = yield* fs.readFileString(\"package.json\").pipe(Effect.map(JSON.parse))\n  const pkg = {\n    name: json.name,\n    version: json.version,\n    type: json.type,\n    description: json.description,\n    main: \"bin.cjs\",\n    bin: \"bin.cjs\",\n    engines: json.engines,\n    dependencies: json.dependencies,\n    peerDependencies: json.peerDependencies,\n    repository: json.repository,\n    author: json.author,\n    license: json.license,\n    bugs: json.bugs,\n    homepage: json.homepage,\n    tags: json.tags,\n    keywords: json.keywords\n  }\n  yield* fs.writeFileString(path.join(\"dist\", \"package.json\"), JSON.stringify(pkg, null, 2))\n  yield* Effect.log(\"[Build] Build completed.\")\n}).pipe(Effect.provide(NodeContext.layer))\n\nEffect.runPromise(program).catch(console.error)\n"
  },
  {
    "path": "apps/cli/src/bin.ts",
    "content": "#!/usr/bin/env node\n\nimport * as NodeContext from \"@effect/platform-node/NodeContext\"\nimport * as NodeRuntime from \"@effect/platform-node/NodeRuntime\"\nimport * as Effect from \"effect/Effect\"\nimport * as Cli from \"./cli.js\"\n\nEffect.suspend(Cli.run).pipe(\n  Effect.provide(NodeContext.layer),\n  Effect.catchAll((error) => {\n    if (error instanceof Error) {\n      Effect.logDebug(error)\n      return Effect.logError(error.message)\n    }\n    return Effect.logError(error)\n  }),\n  NodeRuntime.runMain({ disableErrorReporting: true })\n)\n"
  },
  {
    "path": "apps/cli/src/cli.ts",
    "content": "import { all, cwd, overwrite, path, stylingLibrary, summary, template, yes } from \"@cli/contexts/cli-options.js\"\nimport * as Add from \"@cli/services/commands/add.js\"\nimport * as Doctor from \"@cli/services/commands/doctor.js\"\nimport * as Init from \"@cli/services/commands/init.js\"\nimport { Args, Command, Prompt } from \"@effect/cli\"\nimport { Effect, pipe } from \"effect\"\n\nconst addArgs = Args.all({\n  components: Args.text({ name: \"components\" }).pipe(Args.repeated)\n})\n\nconst AddCommand = Command.make(\"add\", { args: addArgs, cwd, yes, overwrite, all, path, stylingLibrary })\n  .pipe(Command.withDescription(\"Add React Native components to your project\"))\n  .pipe(Command.withHandler(Add.make))\n\nconst DoctorCommand = Command.make(\"doctor\", { cwd, summary, yes })\n  .pipe(Command.withDescription(\"Check your project setup and diagnose issues\"))\n  .pipe(Command.withHandler(Doctor.make))\n\nconst InitCommand = Command.make(\"init\", { cwd, template })\n  .pipe(Command.withDescription(\"Initialize a new React Native project with reusables\"))\n  .pipe(Command.withHandler(Init.make))\n\nconst Cli = Command.make(\"react-native-reusables/cli\", { cwd })\n  .pipe(Command.withDescription(\"React Native Reusables CLI - A powerful toolkit for React Native development\"))\n  .pipe(\n    Command.withHandler((options) =>\n      Effect.gen(function* () {\n        yield* Effect.log(\"React Native Reusables CLI - A powerful toolkit for React Native development\")\n        const choice = yield* Prompt.select({\n          message: \"What would you like to do?\",\n          choices: [\n            { title: \"Add a component\", value: \"add\" },\n            { title: \"Inspect project configuration\", value: \"doctor\" },\n            { title: \"Initialize a new project\", value: \"init\" }\n          ]\n        })\n\n        if (choice === \"add\") {\n          yield* Add.make({\n            cwd: options.cwd,\n            yes: true,\n            overwrite: false,\n            all: false,\n            path: \"\",\n            stylingLibrary: undefined,\n            args: { components: [] }\n          })\n        } else if (choice === \"doctor\") {\n          yield* Doctor.make({ cwd: options.cwd, summary: false, yes: false })\n        } else if (choice === \"init\") {\n          yield* Init.make({ cwd: options.cwd, template: \"\" })\n        }\n      })\n    )\n  )\n  .pipe(Command.withSubcommands([AddCommand, DoctorCommand, InitCommand]))\n\nexport const run = () =>\n  pipe(\n    process.argv,\n    Command.run(Cli, {\n      name: \"@react-native-reusables/cli\",\n      version: \"1.0.0\"\n    })\n  )\n"
  },
  {
    "path": "apps/cli/src/contexts/cli-options.ts",
    "content": "import { Options } from \"@effect/cli\"\nimport { Context, Option } from \"effect\"\n\ntype StylingLibrary = \"nativewind\" | \"uniwind\"\n\nclass CliOptions extends Context.Tag(\"CommandOptions\")<\n  CliOptions,\n  Readonly<{\n    cwd: string\n    yes: boolean\n    stylingLibrary: StylingLibrary | undefined\n  }>\n>() { }\n\nconst cwd = Options.directory(\"cwd\", { exists: \"yes\" }).pipe(Options.withDefault(\".\"), Options.withAlias(\"c\"))\nconst yes = Options.boolean(\"yes\", { aliases: [\"y\"] })\nconst summary = Options.boolean(\"summary\").pipe(Options.withAlias(\"s\"))\nconst overwrite = Options.boolean(\"overwrite\", { aliases: [\"o\"] })\nconst all = Options.boolean(\"all\", { aliases: [\"a\"] })\nconst path = Options.text(\"path\").pipe(Options.withDefault(\"\"), Options.withAlias(\"p\"))\nconst stylingLibrary = Options.choice(\"styling-library\", [\"nativewind\", \"uniwind\"] as const).pipe(\n  Options.optional,\n  Options.map(Option.getOrUndefined),\n  Options.withDescription(\"Override the detected styling library for this command\"),\n)\nconst template = Options.text(\"template\").pipe(Options.withAlias(\"t\"), Options.withDefault(\"\"))\n\nexport { CliOptions, cwd, summary, yes, overwrite, all, path, stylingLibrary, template }\nexport type { StylingLibrary }\n"
  },
  {
    "path": "apps/cli/src/project-manifest.ts",
    "content": "interface FileCheck {\n  name: string\n  fileNames: Array<string>\n  docs: string\n  includes: Array<{\n    content: Array<string>\n    message: string\n    docs: string\n  }>\n  stylingLibraries: Array<\"nativewind\" | \"uniwind\">\n}\n\ntype CustomFileCheck = Omit<FileCheck, \"fileNames\"> & { defaultFileNames?: ReadonlyArray<string> }\n\ninterface FileWithContent extends FileCheck {\n  content: string\n}\n\ninterface MissingInclude {\n  fileName: string\n  content: ReadonlyArray<string>\n  message: string\n  docs: string\n}\n\nconst CORE_DEPENDENCIES = [\n  \"expo\",\n  \"react-native-reanimated\",\n  \"react-native-safe-area-context\",\n  \"tailwindcss-animate\",\n  \"class-variance-authority\",\n  \"clsx\",\n  \"tailwind-merge\"\n]\n\nconst DEPENDENCIES = {\n  nativewind: [...CORE_DEPENDENCIES, \"nativewind\"],\n  uniwind: [...CORE_DEPENDENCIES, \"uniwind\"]\n}\n\nconst DEV_DEPENDENCIES = [\"tailwindcss@^3.4.14\"]\n\nconst FILE_CHECKS: Array<FileCheck> = [\n  {\n    name: \"Babel Config\",\n    fileNames: [\"babel.config.js\", \"babel.config.ts\"],\n    docs: \"https://www.nativewind.dev/docs/getting-started/installation#3-add-the-babel-preset\",\n    includes: [\n      {\n        content: [\"nativewind/babel\", \"jsxImportSource\"],\n        message: \"jsxImportSource or nativewind/babel is missing\",\n        docs: \"https://www.nativewind.dev/docs/getting-started/installation#3-add-the-babel-preset\"\n      }\n    ],\n    stylingLibraries: [\"nativewind\"] as const\n  },\n  {\n    name: \"Metro Config\",\n    fileNames: [\"metro.config.js\", \"metro.config.ts\"],\n    docs: \"https://www.nativewind.dev/docs/getting-started/installation#4-create-or-modify-your-metroconfigjs\",\n    includes: [\n      {\n        content: [\"withNativeWind(\"],\n        message: \"The withNativeWind function is missing\",\n        docs: \"https://www.nativewind.dev/docs/getting-started/installation#4-create-or-modify-your-metroconfigjs\"\n      },\n      {\n        content: [\"inlineRem\", \"16\"],\n        message: \"The 'inlineRem: 16' is missing\",\n        docs: \"https://reactnativereusables.com/docs/installation/manual#update-the-default-inlined-rem-value\"\n      }\n    ],\n    stylingLibraries: [\"nativewind\"] as const\n  },\n  {\n    name: \"Metro Config\",\n    fileNames: [\"metro.config.js\", \"metro.config.ts\"],\n    docs: \"https://www.nativewind.dev/docs/getting-started/installation#4-create-or-modify-your-metroconfigjs\",\n    includes: [\n      {\n        content: [\"withUniwindConfig(\"],\n        message: \"The withUniwindConfig function is missing\",\n        docs: \"https://docs.uniwind.dev/api/metro-config#metro-config-js\"\n      }\n    ],\n    stylingLibraries: [\"uniwind\"] as const\n  },\n  {\n    name: \"Root Layout\",\n    fileNames: [\"app/_layout.tsx\", \"src/app/_layout.tsx\"],\n    docs: \"https://reactnativereusables.com/docs/installation/manual#add-the-portal-host-to-your-root-layout\", //\n    includes: [\n      {\n        content: [\".css\"],\n        message: \"The css file import is missing\",\n        docs: \"https://www.nativewind.dev/docs/getting-started/installation#5-import-your-css-file\"\n      },\n      {\n        content: [\"<PortalHost\"],\n        message: \"The PortalHost component is missing\",\n        docs: \"https://reactnativereusables.com/docs/installation/manual#add-the-portal-host-to-your-root-layout\"\n      }\n    ],\n    stylingLibraries: [\"nativewind\", \"uniwind\"] as const\n  }\n]\n\nconst DEPRECATED_FROM_LIB: Array<Omit<FileCheck, \"docs\" | \"stylingLibraries\">> = [\n  {\n    name: \"Icons\",\n    fileNames: [\"icons/iconWithClassName.ts\"],\n    includes: [\n      {\n        content: [\"iconWithClassName\"],\n        message: \"lib/icons and its contents are deprecated. Use the new icon wrapper from components/ui/icon.\",\n        docs: \"https://reactnativereusables.com/docs/changelog#august-2025-deprecated\"\n      }\n    ]\n  },\n  {\n    name: \"Constants\",\n    fileNames: [\"constants.ts\"],\n    includes: [\n      {\n        content: [\"NAV_THEME\"],\n        message: \"Usage of lib/constants for NAV_THEME is deprecated. Use lib/theme instead.\",\n        docs: \"https://reactnativereusables.com/docs/installation/manual#configure-your-styles\"\n      }\n    ]\n  },\n  {\n    name: \"useColorScheme\",\n    fileNames: [\"useColorScheme.tsx\"],\n    includes: [\n      {\n        content: [\"useColorScheme\"],\n        message: \"lib/useColorScheme is deprecated. Use Nativewind's color scheme hook instead.\",\n        docs: \"https://www.nativewind.dev/docs/api/use-color-scheme\"\n      }\n    ]\n  }\n]\n\nconst DEPRECATED_FROM_UI: Array<Omit<FileCheck, \"docs\" | \"stylingLibraries\">> = [\n  {\n    name: \"Typography\",\n    fileNames: [\"typography.tsx\"],\n    includes: [\n      {\n        content: [\n          \"function H1({\",\n          \"function H2({\",\n          \"function H3({\",\n          \"function H4({\",\n          \"function P({\",\n          \"function BlockQuote({\",\n          \"function Code({\",\n          \"function Lead({\",\n          \"function Large({\",\n          \"function Small({\",\n          \"function Muted({\"\n        ],\n        message:\n          \"Typography is deprecated. Instead, use the Text component with its variant prop (e.g. <Text variant='h1'>Title</Text>)\",\n        docs: \"https://reactnativereusables.com/docs/components/text#typography\"\n      }\n    ]\n  }\n]\n\n// Excludes foreground colors since it is formatted differently in all 3 styling files (tailwind config, global.css, theme.ts)\nconst CSS_VARIABLE_NAMES = [\n  \"background\",\n  \"foreground\",\n  \"card\",\n  \"popover\",\n  \"primary\",\n  \"secondary\",\n  \"muted\",\n  \"accent\",\n  \"destructive\",\n  \"border\",\n  \"input\",\n  \"ring\",\n  \"radius\"\n]\n\nconst CUSTOM_FILE_CHECKS: Record<string, CustomFileCheck> = {\n  tailwindConfig: {\n    name: \"Tailwind Config\",\n    defaultFileNames: [\"tailwind.config.js\", \"tailwind.config.ts\"],\n    docs: \"https://reactnativereusables.com/docs/installation/manual#configure-your-styles\",\n    includes: [\n      {\n        content: [\"nativewind/preset\"],\n        message: \"The nativewind preset is missing\",\n        docs: \"https://www.nativewind.dev/docs/getting-started/installation#2-setup-tailwind-css\"\n      },\n      {\n        content: CSS_VARIABLE_NAMES,\n        message: \"At least one of the color css variables is missing\",\n        docs: \"https://reactnativereusables.com/docs/installation/manual#configure-your-styles\"\n      }\n    ],\n    stylingLibraries: [\"nativewind\"] as const\n  },\n  theme: {\n    name: \"Theme\",\n    defaultFileNames: [\"lib/theme.ts\"],\n    docs: \"https://reactnativereusables.com/docs/installation/manual#configure-your-styles\",\n    includes: [\n      {\n        content: CSS_VARIABLE_NAMES,\n        message: \"At least one of the color variables is missing\",\n        docs: \"https://reactnativereusables.com/docs/installation/manual#configure-your-styles\"\n      },\n      {\n        content: [\"NAV_THEME\"],\n        message: \"The NAV_THEME is missing\",\n        docs: \"https://reactnativereusables.com/docs/installation/manual#configure-your-styles\"\n      }\n    ],\n    stylingLibraries: [\"nativewind\", \"uniwind\"] as const\n  },\n  nativewindEnv: {\n    name: \"Nativewind Env\",\n    docs: \"https://www.nativewind.dev/docs/getting-started/installation#7-typescript-setup-optional\",\n    includes: [\n      {\n        content: [\"nativewind/types\"],\n        message: \"The nativewind types are missing\",\n        docs: \"https://www.nativewind.dev/docs/getting-started/installation#7-typescript-setup-optional\"\n      }\n    ],\n    stylingLibraries: [\"nativewind\"] as const\n  },\n  uniwindTypes: {\n    name: \"Uniwind Types\",\n    defaultFileNames: [\"uniwind-types.d.ts\"],\n    docs: \"https://docs.uniwind.dev/api/metro-config#dtsfile\",\n    includes: [\n      {\n        content: [\"uniwind/types\"],\n        message: \"The uniwind types are missing\",\n        docs: \"https://docs.uniwind.dev/api/metro-config#dtsfile\"\n      }\n    ],\n    stylingLibraries: [\"uniwind\"] as const\n  },\n  utils: {\n    name: \"Utils\",\n    defaultFileNames: [\"lib/utils.ts\"],\n    docs: \"https://reactnativereusables.com/docs/installation/manual#add-a-cn-helper\",\n    includes: [\n      {\n        content: [\"function cn(\"],\n        message: \"The cn function is missing\",\n        docs: \"https://reactnativereusables.com/docs/installation/manual#add-a-cn-helper\"\n      }\n    ],\n    stylingLibraries: [\"nativewind\", \"uniwind\"] as const\n  },\n  css: {\n    name: \"CSS\",\n    defaultFileNames: [\"globals.css\", \"src/global.css\"],\n    docs: \"https://reactnativereusables.com/docs/installation/manual#configure-your-styles\",\n    includes: [\n      {\n        content: [\"@tailwind base\", \"@tailwind components\", \"@tailwind utilities\"],\n        message: \"The tailwind layer directives are missing\",\n        docs: \"https://reactnativereusables.com/docs/installation/manual#configure-your-styles\"\n      },\n      {\n        content: CSS_VARIABLE_NAMES,\n        message: \"At least one of the color css variables is missing\",\n        docs: \"https://reactnativereusables.com/docs/installation/manual#configure-your-styles\"\n      }\n    ],\n    stylingLibraries: [\"nativewind\"] as const\n  },\n  uniwindCss: {\n    name: \"CSS\",\n    defaultFileNames: [\"globals.css\", \"src/global.css\"],\n    docs: \"https://reactnativereusables.com/docs/installation/manual#configure-your-styles\",\n    includes: [\n      {\n        content: [\"tailwindcss\", \"uniwind\"],\n        message: \"The tailwind layer directives are missing\",\n        docs: \"https://reactnativereusables.com/docs/installation/manual#configure-your-styles\"\n      },\n      {\n        content: CSS_VARIABLE_NAMES,\n        message: \"At least one of the color css variables is missing\",\n        docs: \"https://reactnativereusables.com/docs/installation/manual#configure-your-styles\"\n      }\n    ],\n    stylingLibraries: [\"uniwind\"] as const\n  }\n}\n\nconst NATIVEWIND_ENV_FILE = \"nativewind-env.d.ts\"\nconst UNIWIND_TYPES_FILE = \"uniwind-types.d.ts\"\n\nconst COMPONENTS = [\n  \"accordion\",\n  \"alert-dialog\",\n  \"alert\",\n  \"aspect-ratio\",\n  \"avatar\",\n  \"badge\",\n  \"button\",\n  \"card\",\n  \"checkbox\",\n  \"collapsible\",\n  \"context-menu\",\n  \"dialog\",\n  \"dropdown-menu\",\n  \"hover-card\",\n  \"input\",\n  \"label\",\n  \"menubar\",\n  \"popover\",\n  \"progress\",\n  \"radio-group\",\n  \"select\",\n  \"separator\",\n  \"skeleton\",\n  \"switch\",\n  \"tabs\",\n  \"text\",\n  \"textarea\",\n  \"toggle-group\",\n  \"toggle\",\n  \"tooltip\"\n]\n\nconst TEMPLATES = [\n  {\n    name: \"Minimal (Nativewind)\",\n    url: \"https://github.com/founded-labs/react-native-reusables-templates.git\",\n    subPath: \"minimal\"\n  },\n  {\n    name: \"Minimal (Uniwind)\",\n    url: \"https://github.com/founded-labs/react-native-reusables-templates.git\",\n    subPath: \"minimal-uniwind\"\n  },\n  {\n    name: \"Clerk auth (Nativewind)\",\n    url: \"https://github.com/founded-labs/react-native-reusables-templates.git\",\n    subPath: \"clerk-auth\"\n  }\n]\n\nconst PROJECT_MANIFEST = {\n  dependencies: DEPENDENCIES,\n  devDependencies: DEV_DEPENDENCIES,\n  fileChecks: FILE_CHECKS,\n  deprecatedFromLib: DEPRECATED_FROM_LIB,\n  deprecatedFromUi: DEPRECATED_FROM_UI,\n  customFileChecks: CUSTOM_FILE_CHECKS,\n  nativewindEnvFile: NATIVEWIND_ENV_FILE,\n  uniwindTypesFile: UNIWIND_TYPES_FILE,\n  components: COMPONENTS,\n  templates: TEMPLATES\n}\n\nexport { PROJECT_MANIFEST }\nexport type { FileCheck, CustomFileCheck, FileWithContent, MissingInclude }\n"
  },
  {
    "path": "apps/cli/src/services/commands/add.ts",
    "content": "import { CliOptions, type StylingLibrary } from \"@cli/contexts/cli-options.js\"\nimport { PROJECT_MANIFEST } from \"@cli/project-manifest.js\"\nimport { Doctor } from \"@cli/services/commands/doctor.js\"\nimport { runCommand } from \"@cli/utils/run-command.js\"\nimport { Prompt } from \"@effect/cli\"\nimport { Effect, Layer } from \"effect\"\nimport { PackageManager } from \"../package-manager.js\"\nimport { ProjectConfig } from \"../project-config.js\"\n\ntype AddOptions = {\n  cwd: string\n  args: { components: Array<string> }\n  yes: boolean\n  overwrite: boolean\n  all: boolean\n  path: string\n  stylingLibrary: StylingLibrary | undefined\n}\n\nclass Add extends Effect.Service<Add>()(\"Add\", {\n  dependencies: [PackageManager.Default],\n  effect: Effect.gen(function* () {\n    const doctor = yield* Doctor\n    const projectConfig = yield* ProjectConfig\n    const packageManager = yield* PackageManager\n\n    return {\n      run: (options: AddOptions) =>\n        Effect.gen(function* () {\n          yield* Effect.logDebug(`Add options: ${JSON.stringify(options, null, 2)}`)\n\n          yield* projectConfig.getComponentJson() // ensure components.json config is valid and prompt if not\n\n          const components = options.all ? PROJECT_MANIFEST.components : (options.args?.components ?? [])\n\n          if (components.length === 0) {\n            const selectedComponents = yield* Prompt.multiSelect({\n              message: \"Select components to add\",\n              choices: PROJECT_MANIFEST.components.map((component) => ({\n                title: component,\n                value: component\n              }))\n            })\n            for (const component of selectedComponents) {\n              components.push(component)\n            }\n          }\n\n          if (components.length === 0) {\n            yield* Effect.fail(new Error(\"No components selected.\"))\n          }\n\n          yield* Effect.logDebug(`Selected components: ${components.join(\", \")}`)\n\n          const stylingLibrary = yield* projectConfig.getStylingLibrary()\n\n          const registry = stylingLibrary === \"uniwind\" ? \"uniwind\" : \"nativewind\"\n\n          const baseUrl =\n            process.env.INTERNAL_ENV === \"development\"\n              ? `http://localhost:3000/local/r/${registry}`\n              : `https://reactnativereusables.com/r/${registry}`\n\n          const componentUrls = components.map((component) => {\n            const lowerCaseComponent = component.toLocaleLowerCase()\n            return lowerCaseComponent.startsWith(\"http\") ? lowerCaseComponent : `${baseUrl}/${lowerCaseComponent}.json`\n          })\n\n          const shadcnOptions = toShadcnOptions(options)\n\n          const binaryRunner = yield* packageManager.getBinaryRunner(options.cwd)\n\n          const commandArgs = [\n            ...binaryRunner.slice(1),\n            \"shadcn@latest\",\n            \"add\",\n            ...shadcnOptions,\n            ...componentUrls\n          ].filter((option) => option !== undefined)\n\n          yield* Effect.logDebug(`Running command: ${binaryRunner[0]} ${commandArgs.join(\" \")}`)\n\n          yield* runCommand(binaryRunner[0], commandArgs, {\n            cwd: options.cwd,\n            stdio: \"inherit\"\n          })\n\n          yield* doctor.run({ ...options, summary: true })\n        })\n    }\n  })\n}) {}\n\nfunction make(options: AddOptions) {\n  const optionsLayer = Layer.succeed(CliOptions, { ...options, yes: true }) // For the project config\n  return Effect.gen(function* () {\n    const add = yield* Add\n\n    return yield* add.run(options)\n  }).pipe(\n    Effect.provide(Add.Default),\n    Effect.provide(Doctor.Default),\n    Effect.provide(ProjectConfig.Default),\n    Effect.provide(optionsLayer)\n  )\n}\n\nexport { make }\n\nfunction toShadcnOptions(options: AddOptions) {\n  const shadcnOptions = []\n\n  if (options.overwrite) {\n    shadcnOptions.push(\"--overwrite\")\n  }\n\n  if (options.yes) {\n    shadcnOptions.push(\"--yes\")\n  }\n\n  if (options.path) {\n    shadcnOptions.push(\"--path\")\n    shadcnOptions.push(options.path)\n  }\n\n  return shadcnOptions\n}\n"
  },
  {
    "path": "apps/cli/src/services/commands/doctor.ts",
    "content": "import { CliOptions } from \"@cli/contexts/cli-options.js\"\nimport { type CustomFileCheck, type FileCheck, type MissingInclude, PROJECT_MANIFEST } from \"@cli/project-manifest.js\"\nimport { ProjectConfig } from \"@cli/services/project-config.js\"\nimport { RequiredFilesChecker } from \"@cli/services/required-files-checker.js\"\nimport { Spinner } from \"@cli/services/spinner.js\"\nimport { runCommand } from \"@cli/utils/run-command.js\"\nimport { Prompt } from \"@effect/cli\"\nimport { FileSystem, Path } from \"@effect/platform\"\nimport { Data, Effect, Layer, Schema } from \"effect\"\nimport logSymbols from \"log-symbols\"\n\nconst packageJsonSchema = Schema.Struct({\n  dependencies: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.String })),\n  devDependencies: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.String }))\n})\n\nclass PackageJsonError extends Data.TaggedError(\"PackageJsonError\")<{\n  cause?: unknown\n  message?: string\n}> {}\n\ntype DoctorOptions = {\n  cwd: string\n  summary: boolean\n  yes: boolean\n}\n\nclass Doctor extends Effect.Service<Doctor>()(\"Doctor\", {\n  dependencies: [RequiredFilesChecker.Default, Spinner.Default],\n  effect: Effect.gen(function* () {\n    const options = yield* CliOptions\n    const fs = yield* FileSystem.FileSystem\n    const path = yield* Path.Path\n    const requiredFileChecker = yield* RequiredFilesChecker\n    const spinner = yield* Spinner\n    const projectConfig = yield* ProjectConfig\n\n    const stylingLibrary = yield* projectConfig.getStylingLibrary()\n\n    if (stylingLibrary !== \"unknown\"){\n      console.log(\n        `\\x1b[2m${logSymbols.info} Styling Library: ${stylingLibrary === \"uniwind\" ? \"Uniwind\" : \"Nativewind\"}\\x1b[0m`\n      )\n    } \n\n\n    const checkRequiredDependencies = ({\n      dependencies,\n      devDependencies\n    }: {\n      dependencies: Array<string>\n      devDependencies: Array<string>\n    }) =>\n      Effect.gen(function* () {\n        const packageJsonExists = yield* fs.exists(path.join(options.cwd, \"package.json\"))\n        if (!packageJsonExists) {\n          return yield* Effect.fail(new PackageJsonError({ message: \"A package.json was not found and is required.\" }))\n        }\n\n        const packageJson = yield* fs.readFileString(path.join(options.cwd, \"package.json\")).pipe(\n          Effect.flatMap(Schema.decodeUnknown(Schema.parseJson())),\n          Effect.flatMap(Schema.decodeUnknown(packageJsonSchema)),\n          Effect.catchTags({\n            ParseError: () => Effect.fail(new PackageJsonError({ message: \"Failed to parse package.json\" }))\n          })\n        )\n\n        const uninstalledDependencies: Array<string> = []\n        const uninstalledDevDependencies: Array<string> = []\n\n        for (const dependency of dependencies) {\n          if (\n            !packageJson.dependencies?.[dependency.split(\"@\")[0]] &&\n            !packageJson.devDependencies?.[dependency.split(\"@\")[0]]\n          ) {\n            uninstalledDependencies.push(dependency)\n            continue\n          }\n          yield* Effect.logDebug(\n            `${logSymbols.success} ${dependency}@${packageJson.dependencies?.[dependency.split(\"@\")[0]]} is installed`\n          )\n        }\n\n        for (const devDependency of devDependencies) {\n          if (\n            !packageJson.devDependencies?.[devDependency.split(\"@\")[0]] &&\n            !packageJson.dependencies?.[devDependency.split(\"@\")[0]]\n          ) {\n            uninstalledDevDependencies.push(devDependency)\n            continue\n          }\n          yield* Effect.logDebug(\n            `${logSymbols.success} ${devDependency}@${packageJson.devDependencies?.[devDependency]} is installed`\n          )\n        }\n\n        return { uninstalledDependencies, uninstalledDevDependencies }\n      })\n\n    const registry = stylingLibrary === \"uniwind\" ? \"uniwind\" : \"nativewind\"\n\n    return {\n      run: (options: DoctorOptions) =>\n        Effect.gen(function* () {\n          yield* Effect.logDebug(`Doctor options: ${JSON.stringify(options, null, 2)}`)\n          const { uninstalledDependencies, uninstalledDevDependencies } = yield* checkRequiredDependencies({\n            dependencies: PROJECT_MANIFEST.dependencies[registry],\n            devDependencies: PROJECT_MANIFEST.devDependencies\n          })\n\n          const { customFileResults, deprecatedFileResults, fileResults } = yield* requiredFileChecker.run({\n            customFileChecks: PROJECT_MANIFEST.customFileChecks,\n            deprecatedFromLib: PROJECT_MANIFEST.deprecatedFromLib,\n            deprecatedFromUi: PROJECT_MANIFEST.deprecatedFromUi,\n            fileChecks: PROJECT_MANIFEST.fileChecks,\n            stylingLibrary: registry \n          })\n\n          const result = {\n            missingFiles: [...fileResults.missingFiles, ...customFileResults.missingFiles],\n            uninstalledDependencies,\n            uninstalledDevDependencies,\n            missingIncludes: [...fileResults.missingIncludes, ...customFileResults.missingIncludes],\n            deprecatedFileResults\n          }\n\n          let total = Object.values(result).reduce((sum, cat) => sum + cat.length, 0)\n          if (!options.summary) {\n            const dependenciesToInstall: Array<string> = []\n            for (const dep of result.uninstalledDependencies) {\n              const confirmsInstall = options.yes\n                ? true\n                : yield* Prompt.confirm({\n                    message: `The ${dep} dependency is missing. Do you want to install it?`,\n                    initial: true\n                  })\n              if (confirmsInstall) {\n                if (uninstalledDependencies.includes(\"expo\")) {\n                  continue\n                }\n                total--\n                yield* Effect.logDebug(`Adding ${dep} to dependencies to install`)\n                dependenciesToInstall.push(dep)\n                result.uninstalledDependencies = result.uninstalledDependencies.filter((d) => d !== dep)\n              }\n            }\n\n            if (dependenciesToInstall.length > 0) {\n              yield* Effect.logDebug(`Installing ${dependenciesToInstall.join(\", \")}`)\n              if (process.env.INTERNAL_ENV !== \"development\") {\n                spinner.start(\"Installing dependencies\")\n                yield* runCommand(\"npx\", [\"expo\", \"install\", ...dependenciesToInstall], {\n                  cwd: options.cwd\n                })\n                spinner.stop()\n              }\n            }\n\n            const devDependenciesToInstall: Array<string> = []\n            for (const dep of result.uninstalledDevDependencies) {\n              const confirmsInstall = options.yes\n                ? true\n                : yield* Prompt.confirm({\n                    message: `The ${dep} dependency is missing. Do you want to install it?`,\n                    initial: true\n                  })\n              if (confirmsInstall) {\n                if (uninstalledDependencies.includes(\"expo\")) {\n                  continue\n                }\n                total--\n                yield* Effect.logDebug(`Adding ${dep} to devDependencies to install`)\n                devDependenciesToInstall.push(dep)\n                result.uninstalledDevDependencies = result.uninstalledDevDependencies.filter((d) => d !== dep)\n              }\n            }\n\n            if (devDependenciesToInstall.length > 0) {\n              yield* Effect.logDebug(`Installing ${devDependenciesToInstall.join(\", \")}`)\n              if (process.env.INTERNAL_ENV !== \"development\") {\n                spinner.start(\"Installing dev dependencies\")\n                yield* runCommand(\"npx\", [\"expo\", \"install\", ...devDependenciesToInstall], {\n                  cwd: options.cwd\n                })\n                spinner.stop()\n              }\n            }\n          }\n\n          if (total === 0) {\n            console.log(`\\x1b[2m${logSymbols.success} All checks passed.\\x1b[0m\\n`)\n            return yield* Effect.succeed(true)\n          }\n\n          const analysis = analyzeResult(result)\n          if (options.summary) {\n            console.log(\n              `\\x1b[2m${logSymbols.warning} ${total} Potential issue${\n                total > 1 ? \"s\" : \"\"\n              } found. For more info, run: 'npx @react-native-reusables/cli doctor${\n                options.cwd !== \".\" ? ` -c ${options.cwd}` : \"\"\n              }'\\x1b[0m\\n`\n            )\n          } else {\n            yield* Effect.log(\"\\n\\n🩺 Diagnosis\")\n            for (const item of analysis) {\n              console.group(`\\n${item.title}`)\n              item.logs.forEach((line) => console.log(line))\n              console.groupEnd()\n            }\n            console.log(`\\n`)\n          }\n        })\n    }\n  })\n}) {}\n\nfunction make(options: DoctorOptions) {\n  const optionsLayer = Layer.succeed(CliOptions, { ...options, stylingLibrary: undefined })\n  return Effect.gen(function* () {\n    const doctor = yield* Doctor\n    return yield* doctor.run(options)\n  }).pipe(Effect.provide(Doctor.Default), Effect.provide(ProjectConfig.Default), Effect.provide(optionsLayer))\n}\n\nexport { Doctor, make }\n\ninterface Result {\n  missingFiles: Array<FileCheck | CustomFileCheck>\n  missingIncludes: Array<MissingInclude>\n  uninstalledDependencies: Array<string>\n  uninstalledDevDependencies: Array<string>\n  deprecatedFileResults: Array<Omit<FileCheck, \"docs\" | \"stylingLibraries\">>\n}\n\nfunction analyzeResult(result: Result) {\n  const categories: Array<{ title: string; logs: Array<string>; count: number }> = []\n\n  if (result.missingFiles.length > 0) {\n    categories.push({\n      title: `${logSymbols.error} Missing Files (${result.missingFiles.length})`,\n      count: result.missingFiles.length,\n      logs: result.missingFiles.flatMap((f) => [`• ${f.name}`, `  📘 Docs: ${f.docs}`])\n    })\n  }\n\n  if (result.missingIncludes.length > 0) {\n    categories.push({\n      title: `${logSymbols.error} Potentially Misconfigured Files (${result.missingIncludes.length})`,\n      count: result.missingIncludes.length,\n      logs: result.missingIncludes.flatMap((inc) => [\n        `• ${inc.fileName}`,\n        `  ↪ ${inc.message}`,\n        `  📘 Docs: ${inc.docs}`\n      ])\n    })\n  }\n\n  if (result.uninstalledDependencies.length > 0) {\n    categories.push({\n      title: `${logSymbols.error} Missing Dependencies (${result.uninstalledDependencies.length})`,\n      count: result.uninstalledDependencies.length,\n      logs: [\"• Install with:\", `  ↪ npx expo install ${result.uninstalledDependencies.join(\" \")}`]\n    })\n  }\n\n  if (result.uninstalledDevDependencies.length > 0) {\n    categories.push({\n      title: `${logSymbols.error} Missing Dev Dependencies (${result.uninstalledDevDependencies.length})`,\n      count: result.uninstalledDevDependencies.length,\n      logs: [\"• Install with:\", `  ↪ npx expo install -- -D ${result.uninstalledDevDependencies.join(\" \")}`]\n    })\n  }\n\n  if (result.deprecatedFileResults.length > 0) {\n    categories.push({\n      title: `${logSymbols.warning} Deprecated (${result.deprecatedFileResults.length})`,\n      count: result.deprecatedFileResults.length,\n      logs: result.deprecatedFileResults.flatMap((deprecatedFile) => [\n        `• ${deprecatedFile.name}`,\n        ...deprecatedFile.includes.map((item) => `  ↪ ${item.message}\\n  📘 Docs: ${item.docs}`)\n      ])\n    })\n  }\n\n  return categories\n}\n"
  },
  {
    "path": "apps/cli/src/services/commands/init.ts",
    "content": "import { CliOptions } from \"@cli/contexts/cli-options.js\"\nimport { PROJECT_MANIFEST } from \"@cli/project-manifest.js\"\nimport { Doctor } from \"@cli/services/commands/doctor.js\"\nimport { ProjectConfig } from \"@cli/services/project-config.js\"\nimport { Template } from \"@cli/services/template.js\"\nimport { Prompt } from \"@effect/cli\"\nimport { FileSystem, Path } from \"@effect/platform\"\nimport { Effect, Layer } from \"effect\"\nimport logSymbols from \"log-symbols\"\n\ntype InitOptions = {\n  cwd: string\n  template: string\n}\n\nclass Init extends Effect.Service<Init>()(\"Init\", {\n  dependencies: [Template.Default],\n  effect: Effect.gen(function* () {\n    const fs = yield* FileSystem.FileSystem\n    const path = yield* Path.Path\n    const doctor = yield* Doctor\n    const template = yield* Template\n\n    return {\n      run: (options: InitOptions) =>\n        Effect.gen(function* () {\n          yield* Effect.logDebug(`Init options: ${JSON.stringify(options, null, 2)}`)\n\n          const packageJsonExists = yield* fs.exists(path.join(options.cwd, \"package.json\"))\n\n          yield* Effect.logDebug(`Does package.json exist: ${packageJsonExists ? \"yes\" : \"no\"}`)\n\n          if (packageJsonExists) {\n            yield* Effect.logWarning(`${logSymbols.warning} A project already exists in this directory.`)\n            const choice = yield* Prompt.select({\n              message: \"How would you like to proceed?\",\n              choices: [\n                { title: \"Initialize a new project here anyway\", value: \"init-new\" },\n                { title: \"Inspect project configuration\", value: \"doctor\" },\n                { title: \"Cancel and exit\", value: \"cancel\" }\n              ]\n            })\n            yield* Effect.logDebug(`Init choice: ${choice}`)\n            if (choice === \"cancel\") {\n              return yield* Effect.succeed(true)\n            }\n            if (choice === \"doctor\") {\n              console.log(\"\")\n              return yield* doctor.run({ ...options, summary: false, yes: false })\n            }\n          }\n\n          const projectName = yield* Prompt.text({\n            message: \"What is the name of your project? (e.g. my-app)\",\n            default: \"my-app\"\n          })\n\n          const templateFromFlag = PROJECT_MANIFEST.templates.find((t) => t.subPath === options.template)\n\n          const selectedTemplate = templateFromFlag\n            ? templateFromFlag\n            : yield* Prompt.select({\n                message: \"Select a template\",\n                choices: PROJECT_MANIFEST.templates.map((template) => ({\n                  title: template.name,\n                  value: template\n                }))\n              })\n\n          yield* template.clone({\n            cwd: options.cwd,\n            name: projectName,\n            repo: selectedTemplate\n          })\n        })\n    }\n  })\n}) {}\n\nfunction make(options: InitOptions) {\n  const optionsLayer = Layer.succeed(CliOptions, { ...options, yes: true, stylingLibrary: undefined })\n  return Effect.gen(function* () {\n    const init = yield* Init\n\n    return yield* init.run(options)\n  }).pipe(\n    Effect.provide(Init.Default),\n    Effect.provide(Doctor.Default),\n    Effect.provide(ProjectConfig.Default),\n    Effect.provide(optionsLayer)\n  )\n}\n\nexport { make }\n"
  },
  {
    "path": "apps/cli/src/services/git.ts",
    "content": "import { Data, Effect } from \"effect\"\nimport { Command } from \"@effect/platform\"\nimport { Prompt } from \"@effect/cli\"\nimport logSymbols from \"log-symbols\"\n\nexport class GitError extends Data.TaggedError(\"GitError\")<{\n  cause?: unknown\n  message?: string\n}> {}\n\nconst COMMANDS = {\n  status: Command.make(\"git\", \"status\", \"--porcelain\")\n} as const\n\nexport class Git extends Effect.Service<Git>()(\"Git\", {\n  succeed: {\n    promptIfDirty: () =>\n      Effect.gen(function* () {\n        const gitStatus = yield* COMMANDS.status.pipe(\n          Command.string,\n          Effect.catchAll(() => Effect.succeed(\"\")) // Not a git repository\n        )\n        const isDirty = gitStatus.trim().length > 0\n        if (!isDirty) {\n          return false\n        }\n        const result = yield* Prompt.confirm({\n          message: `${logSymbols.warning} The Git repository is dirty (uncommitted changes). Continue anyway?`,\n          initial: true\n        })\n\n        if (!result) {\n          return yield* Effect.fail(new GitError({ message: \"Aborted due to uncommitted changes.\" }))\n        }\n\n        return result\n      })\n  }\n}) {}\n"
  },
  {
    "path": "apps/cli/src/services/package-manager.ts",
    "content": "import { Effect } from \"effect\"\nimport { detect } from \"package-manager-detector\"\n\nconst PACKAGE_MANAGERS = [\"npm\", \"bun\", \"pnpm\", \"yarn@berry\", \"yarn\"] as const\n\nconst BINARY_RUNNERS = {\n  npm: [\"npx\"],\n  bun: [\"bunx\", \"--bun\"],\n  pnpm: [\"pnpm\", \"dlx\"],\n  yarn: [\"npx\"],\n  \"yarn@berry\": [\"npx\"]\n} as const\n\nconst detectPackageManager = (cwd: string) =>\n  Effect.tryPromise({\n    try: () => {\n      return detect({\n        cwd,\n        strategies: [\"install-metadata\", \"lockfile\", \"packageManager-field\", \"devEngines-field\"]\n      })\n    },\n    catch: () => new Error(\"Failed to get package manager\")\n  })\n\nconst getPackageManager = (cwd: string) =>\n  Effect.gen(function* () {\n    const pm = yield* detectPackageManager(cwd)\n    if (!pm) {\n      return \"npm\"\n    }\n    const name = PACKAGE_MANAGERS.find((name) => pm.agent.startsWith(name) || pm.name.startsWith(name)) ?? \"npm\"\n    return name\n  })\nconst getBinaryRunner = (cwd: string) =>\n  Effect.gen(function* () {\n    const pm = yield* getPackageManager(cwd)\n    return BINARY_RUNNERS[pm]\n  })\n\nclass PackageManager extends Effect.Service<PackageManager>()(\"PackageManager\", {\n  succeed: {\n    detectPackageManager,\n    getPackageManager,\n    getBinaryRunner\n  }\n}) {}\n\nexport { PackageManager }\n"
  },
  {
    "path": "apps/cli/src/services/project-config.ts",
    "content": "import { CliOptions } from \"@cli/contexts/cli-options.js\"\nimport { retryWith } from \"@cli/utils/retry-with.js\"\nimport { Prompt } from \"@effect/cli\"\nimport { FileSystem, Path } from \"@effect/platform\"\nimport { Effect, Schema } from \"effect\"\nimport { Git } from \"./git.js\"\nimport { type ConfigLoaderSuccessResult, createMatchPath, loadConfig as loadTypescriptConfig } from \"tsconfig-paths\"\nimport { PROJECT_MANIFEST } from \"@cli/project-manifest.js\"\n\nconst componentJsonSchema = Schema.Struct({\n  $schema: Schema.optional(Schema.String),\n  style: Schema.String,\n  rsc: Schema.Boolean,\n  tsx: Schema.Boolean,\n  tailwind: Schema.Struct({\n    config: Schema.optional(Schema.String),\n    css: Schema.String,\n    baseColor: Schema.String,\n    cssVariables: Schema.Boolean,\n    prefix: Schema.optional(Schema.String)\n  }),\n  aliases: Schema.Struct({\n    components: Schema.String,\n    utils: Schema.String,\n    ui: Schema.optional(Schema.String),\n    lib: Schema.optional(Schema.String),\n    hooks: Schema.optional(Schema.String)\n  }),\n  iconLibrary: Schema.optional(Schema.String)\n})\n\nconst supportedExtensions = [\".ts\", \".tsx\", \".jsx\", \".js\", \".css\"]\n\nclass ProjectConfig extends Effect.Service<ProjectConfig>()(\"ProjectConfig\", {\n  dependencies: [Git.Default],\n  effect: Effect.gen(function* () {\n    const fs = yield* FileSystem.FileSystem\n    const path = yield* Path.Path\n    const options = yield* CliOptions\n    const git = yield* Git\n\n    let componentJsonConfig: typeof componentJsonSchema.Type | null = null\n    let tsConfig: ConfigLoaderSuccessResult | null = null\n\n    const getComponentJson = () =>\n      Effect.gen(function* () {\n        if (componentJsonConfig) {\n          return componentJsonConfig\n        }\n\n        const componentJsonExists = yield* fs.exists(path.join(options.cwd, \"components.json\"))\n        if (!componentJsonExists) {\n          return yield* handleInvalidComponentJson(false)\n        }\n        const config = yield* fs.readFileString(path.join(options.cwd, \"components.json\")).pipe(\n          Effect.flatMap(Schema.decodeUnknown(Schema.parseJson())),\n          Effect.flatMap(Schema.decodeUnknown(componentJsonSchema)),\n          Effect.catchTags({\n            ParseError: () => handleInvalidComponentJson(true)\n          })\n        )\n\n        componentJsonConfig = config\n\n        yield* Effect.logDebug(`componentJsonConfig: ${JSON.stringify(componentJsonConfig, null, 2)}`)\n        return config\n      })\n\n    const getUniwindDtsPath = () =>\n      Effect.gen(function* () {\n        const metroConfigPaths = [\"metro.config.js\", \"metro.config.ts\"].map((p) => path.join(options.cwd, p)) as [\n          string,\n          ...Array<string>\n        ]\n\n        const metroContent = yield* retryWith((filePath: string) => fs.readFileString(filePath), metroConfigPaths).pipe(\n          Effect.catchAll(() => Effect.succeed(null))\n        )\n\n        if (!metroContent?.includes(\"withUniwindConfig\")) {\n          return null\n        }\n\n        const dtsFileMatch = metroContent.match(/dtsFile\\s*:\\s*[\"']([^\"']+)[\"']/)\n        if (dtsFileMatch?.[1]) {\n          const dtsPath = dtsFileMatch[1].replace(/^\\.\\//, \"\")\n          return path.join(options.cwd, dtsPath)\n        }\n\n        return path.join(options.cwd, PROJECT_MANIFEST.uniwindTypesFile)\n      })\n\n    const getStylingLibrary = () =>\n      Effect.gen(function* () {\n        if (options.stylingLibrary) {\n          return options.stylingLibrary\n        }\n\n        const metroConfigPaths = [\"metro.config.js\", \"metro.config.ts\"].map((p) => path.join(options.cwd, p)) as [\n          string,\n          ...Array<string>\n        ]\n\n        const metroContent = yield* retryWith((filePath: string) => fs.readFileString(filePath), metroConfigPaths).pipe(\n          Effect.catchAll(() => Effect.succeed(null))\n        )\n\n        if (metroContent?.includes(\"withUniwindConfig\")) {\n          return \"uniwind\" as const\n        }\n\n        // v4 uses withNativeWind\n        // v5 uses withNativewind\n        if (metroContent?.toLowerCase().includes(\"withnativewind\")) {\n          return \"nativewind\" as const\n        }\n\n        return \"unknown\" as const \n      })\n\n    const handleInvalidComponentJson = (exists: boolean) =>\n      Effect.gen(function* () {\n        yield* Effect.logWarning(\n          `${exists ? \"Invalid components.json\" : \"Missing components.json\"}${\" (required to continue)\"}`\n        )\n        const agreeToWrite =  yield* Prompt.confirm({\n              message: `Would you like to ${exists ? \"update the\" : \"write a\"} components.json file?`,\n              label: { confirm: \"y\", deny: \"n\" },\n              initial: true,\n              placeholder: { defaultConfirm: \"y/n\" }\n            })\n        if (!agreeToWrite) {\n          return yield* Effect.fail(new Error(\"Unable to continue without a valid components.json file.\"))\n        }\n\n        const baseColor = options.yes\n          ? \"neutral\"\n          : yield* Prompt.select({\n              message: \"Which color would you like to use as the base color?\",\n              choices: [\n                { title: \"neutral\", value: \"neutral\" },\n                { title: \"stone\", value: \"stone\" },\n                { title: \"zinc\", value: \"zinc\" },\n                { title: \"gray\", value: \"gray\" },\n                { title: \"slate\", value: \"slate\" }\n              ] as const\n            })\n\n        const hasRootGlobalCss = yield* fs.exists(path.join(options.cwd, \"global.css\"))\n\n        const hasSrcGlobalCss = hasRootGlobalCss ? false : yield* fs.exists(path.join(options.cwd, \"src/global.css\"))\n\n        const detectedCss = hasRootGlobalCss ? \"global.css\" : hasSrcGlobalCss ? \"src/global.css\" : \"\"\n\n        const css =\n          options.yes && detectedCss\n            ? detectedCss\n            : yield* Prompt.text({\n                message: \"What is the name of the CSS file and path to it? (e.g. global.css or src/global.css)\",\n                default: detectedCss\n              })\n        \n        const stylingLibrary = yield* getStylingLibrary()\n\n        const hasTailwindConfig = yield* fs.exists(path.join(options.cwd, \"tailwind.config.js\"))\n        const tailwindConfig = stylingLibrary === \"uniwind\" ? \"\" :\n          options.yes && hasTailwindConfig\n            ? \"tailwind.config.js\"\n            : yield* Prompt.text({\n                message:\n                  \"What is the name of the Tailwind config file and path to it? (e.g. tailwind.config.js or src/tailwind.config.js)\",\n                default: \"tailwind.config.js\"\n              })\n\n        const tsConfig = yield* getTsConfig()\n\n        const aliasSymbol = `${(Object.keys(tsConfig.paths ?? {})[0] ?? \"@/*\").split(\"/*\")[0]}`\n\n        const detectedAliases = {\n          components: `${aliasSymbol}/components`,\n          utils: `${aliasSymbol}/lib/utils`,\n          ui: `${aliasSymbol}/components/ui`,\n          lib: `${aliasSymbol}/lib`,\n          hooks: `${aliasSymbol}/hooks`\n        }\n\n        let aliases = detectedAliases\n\n        if (!options.yes) {\n          const useDetectedAliases = yield* Prompt.confirm({\n            message: `Use detected alias (${aliasSymbol}/*) in your setup?`,\n            initial: true\n          })\n\n          if (!useDetectedAliases) {\n            const [componentsAlias, utilsAlias, uiAlias, libAlias, hooksAlias] = yield* Prompt.all([\n              Prompt.text({\n                message: \"What is the name of the components alias?\",\n                default: detectedAliases.components\n              }),\n              Prompt.text({\n                message: \"What is the name of the utils alias?\",\n                default: detectedAliases.utils\n              }),\n              Prompt.text({\n                message: \"What is the name of the ui alias?\",\n                default: detectedAliases.ui\n              }),\n              Prompt.text({\n                message: \"What is the name of the lib alias?\",\n                default: detectedAliases.lib\n              }),\n              Prompt.text({\n                message: \"What is the name of the hooks alias?\",\n                default: detectedAliases.hooks\n              })\n            ])\n\n            aliases = {\n              components: componentsAlias,\n              utils: utilsAlias,\n              ui: uiAlias,\n              lib: libAlias,\n              hooks: hooksAlias\n            }\n          }\n        }\n\n        const newComponentJson = yield* Schema.encode(componentJsonSchema)({\n          $schema: \"https://ui.shadcn.com/schema.json\",\n          style: \"new-york\",\n          aliases,\n          rsc: false,\n          tsx: true,\n          tailwind: {\n            css,\n            baseColor,\n            cssVariables: true,\n            config: tailwindConfig\n          }\n        })\n\n        yield* git.promptIfDirty()\n        yield* fs.writeFileString(path.join(options.cwd, \"components.json\"), JSON.stringify(newComponentJson, null, 2))\n        yield* Effect.logDebug(`newComponentJson: ${JSON.stringify(newComponentJson, null, 2)}`)\n        return newComponentJson\n      })\n\n    const getTsConfig = () =>\n      Effect.try({\n        try: () => {\n          if (tsConfig) {\n            return tsConfig\n          }\n          const configResult = loadTypescriptConfig(options.cwd)\n          if (configResult.resultType === \"failed\") {\n            throw new Error(\"Error loading tsconfig.json\", { cause: configResult.message })\n          }\n          tsConfig = configResult\n          return configResult\n        },\n        catch: (error) => new Error(\"Error loading {ts,js}config.json\", { cause: String(error) })\n      })\n\n    const resolvePathFromAlias = (aliasPath: string) =>\n      Effect.gen(function* () {\n        const config = yield* getTsConfig()\n        return yield* Effect.try({\n          try: () => {\n            const matchPath = createMatchPath(config.absoluteBaseUrl, config.paths)(\n              aliasPath,\n              undefined,\n              () => true,\n              supportedExtensions\n            )\n            if (!matchPath) {\n              throw new Error(\"Path not found\", { cause: aliasPath })\n            }\n            return matchPath\n          },\n          catch: (error) => new Error(\"Path not found\", { cause: String(error) })\n        })\n      })\n\n    return {\n      getComponentJson,\n      getTsConfig,\n      resolvePathFromAlias,\n      getStylingLibrary,\n      getUniwindDtsPath\n    }\n  })\n}) {}\n\nexport { ProjectConfig }\n"
  },
  {
    "path": "apps/cli/src/services/required-files-checker.ts",
    "content": "import { CliOptions } from \"@cli/contexts/cli-options.js\"\nimport type { CustomFileCheck, FileCheck, FileWithContent, MissingInclude } from \"@cli/project-manifest.js\"\nimport { PROJECT_MANIFEST } from \"@cli/project-manifest.js\"\nimport { ProjectConfig } from \"@cli/services/project-config.js\"\nimport { retryWith } from \"@cli/utils/retry-with.js\"\nimport { FileSystem, Path } from \"@effect/platform\"\nimport { Data, Effect } from \"effect\"\nimport logSymbols from \"log-symbols\"\n\nclass RequiredFileError extends Data.TaggedError(\"RequiredFileError\")<{\n  file: string\n  message?: string\n}> { }\n\nclass RequiredFilesChecker extends Effect.Service<RequiredFilesChecker>()(\"RequiredFilesChecker\", {\n  effect: Effect.gen(function* () {\n    const fs = yield* FileSystem.FileSystem\n    const path = yield* Path.Path\n    const options = yield* CliOptions\n    const projectConfig = yield* ProjectConfig\n\n    const checkFiles = (fileChecks: Array<FileCheck>, stylingLibrary: \"nativewind\" | \"uniwind\") =>\n      Effect.gen(function* () {\n        const missingFiles: Array<FileCheck> = []\n        const missingIncludes: Array<MissingInclude> = []\n\n        const filesWithContent = yield* Effect.forEach(\n          fileChecks.filter((file) => file.stylingLibraries.includes(stylingLibrary)),\n          (file) =>\n            retryWith(\n              (filePath: string) =>\n                Effect.gen(function* () {\n                  const fileContents = yield* fs.readFileString(filePath)\n                  yield* Effect.logDebug(`${logSymbols.success} ${file.name} found`)\n                  return { ...file, content: fileContents } as FileWithContent\n                }),\n              file.fileNames.map((p) => path.join(options.cwd, p)) as [string, ...Array<string>]\n            ).pipe(\n              Effect.catchAll(() => {\n                missingFiles.push(file)\n                return Effect.logDebug(`${logSymbols.error} ${file.name} not found`).pipe(() => Effect.succeed(null))\n              })\n            ),\n          { concurrency: \"unbounded\" }\n        ).pipe(Effect.map((files) => files.filter((file): file is FileWithContent => file !== null)))\n\n        yield* Effect.forEach(filesWithContent, (file) =>\n          Effect.gen(function* () {\n            const { content, includes, name } = file\n            for (const include of includes) {\n              if (include.content.every((str) => content.includes(str))) {\n                yield* Effect.logDebug(`${logSymbols.success} ${name} has ${include.content.join(\", \")}`)\n                continue\n              }\n              yield* Effect.logDebug(`${logSymbols.error} ${name} missing ${include.content.join(\", \")}`)\n              missingIncludes.push({ ...include, fileName: name })\n            }\n          })\n        )\n\n        return { missingFiles, missingIncludes }\n      })\n\n    const checkDeprecatedFiles = (\n      deprecatedFromLib: Array<Omit<FileCheck, \"docs\" | \"stylingLibraries\">>,\n      deprecatedFromUi: Array<Omit<FileCheck, \"docs\" | \"stylingLibraries\">>\n    ) =>\n      Effect.gen(function* () {\n        const componentJson = yield* projectConfig.getComponentJson()\n        const aliasForLib = componentJson.aliases.lib ?? `${componentJson.aliases.utils}/lib`\n\n        const existingDeprecatedFromLibs = yield* Effect.forEach(\n          deprecatedFromLib,\n          (file) =>\n            projectConfig.resolvePathFromAlias(`${aliasForLib}/${file.fileNames[0]}`).pipe(\n              Effect.flatMap((fullPath) =>\n                Effect.gen(function* () {\n                  const exists = yield* fs.exists(fullPath)\n                  if (!exists) {\n                    yield* Effect.logDebug(\n                      `${logSymbols.success} Deprecated ${aliasForLib}/${file.fileNames[0]} not found`\n                    )\n                    return { ...file, hasIncludes: false }\n                  }\n\n                  yield* Effect.logDebug(`${logSymbols.error} Deprecated ${aliasForLib}/${file.fileNames[0]} found`)\n\n                  const fileContent = yield* fs.readFileString(fullPath)\n\n                  return {\n                    ...file,\n                    hasIncludes: file.includes.some((include) =>\n                      include.content.some((content) => fileContent.includes(content))\n                    )\n                  }\n                })\n              )\n            ),\n          { concurrency: \"unbounded\" }\n        ).pipe(\n          Effect.map((results) =>\n            results.filter((result) => result.hasIncludes).map(({ hasIncludes: _hasIncludes, ...result }) => result)\n          )\n        )\n\n        const aliasForUi = componentJson.aliases.ui ?? `${componentJson.aliases.components}/ui`\n\n        const existingDeprecatedFromUi = yield* Effect.forEach(\n          deprecatedFromUi,\n          (file) =>\n            projectConfig.resolvePathFromAlias(`${aliasForUi}/${file.fileNames[0]}`).pipe(\n              Effect.flatMap((fullPath) =>\n                Effect.gen(function* () {\n                  const exists = yield* fs.exists(fullPath)\n                  if (!exists) {\n                    yield* Effect.logDebug(\n                      `${logSymbols.success} Deprecated ${aliasForUi}/${file.fileNames[0]} not found`\n                    )\n                    return { ...file, hasIncludes: false }\n                  }\n\n                  yield* Effect.logDebug(`${logSymbols.error} Deprecated ${aliasForUi}/${file.fileNames[0]} found`)\n\n                  const fileContent = yield* fs.readFileString(fullPath)\n\n                  return {\n                    ...file,\n                    hasIncludes: file.includes.some((include) =>\n                      include.content.some((content) => fileContent.includes(content))\n                    )\n                  }\n                })\n              )\n            ),\n          { concurrency: \"unbounded\" }\n        ).pipe(\n          Effect.map((results) =>\n            results.filter((result) => result.hasIncludes).map(({ hasIncludes: _hasIncludes, ...result }) => result)\n          )\n        )\n\n        return [...existingDeprecatedFromLibs, ...existingDeprecatedFromUi]\n      })\n\n    const checkCustomFiles = (\n      customFileChecks: Record<string, CustomFileCheck>,\n      stylingLibrary: \"nativewind\" | \"uniwind\"\n    ) =>\n      Effect.gen(function* () {\n        const componentJson = yield* projectConfig.getComponentJson()\n        const aliasForLib = componentJson.aliases.lib ?? `${componentJson.aliases.utils}/lib`\n        const missingFiles: Array<CustomFileCheck> = []\n        const missingIncludes: Array<MissingInclude> = []\n\n        // Check CSS files\n        const cssPaths = [componentJson.tailwind.css, \"global.css\", \"src/global.css\"].filter((p) => p != null)\n        const cssContent = yield* retryWith(\n          (filePath: string) =>\n            Effect.gen(function* () {\n              const content = yield* fs.readFileString(filePath)\n              yield* Effect.logDebug(`${logSymbols.success} ${customFileChecks.css.name} found`)\n              return content\n            }),\n          cssPaths.map((p) => path.join(options.cwd, p)) as [string, ...Array<string>]\n        ).pipe(\n          Effect.catchAll(() =>\n            Effect.fail(\n              new RequiredFileError({\n                file: \"CSS\",\n                message:\n                  \"CSS file not found. Please follow the instructions at https://www.nativewind.dev/docs/getting-started/installation#installation-with-expo\"\n              })\n            )\n          )\n        )\n\n        const cssShouldInclude =\n          stylingLibrary === \"uniwind\" ? customFileChecks.uniwindCss.includes : customFileChecks.css.includes\n\n        for (const include of cssShouldInclude) {\n          if (include.content.every((str) => cssContent.includes(str))) {\n            yield* Effect.logDebug(\n              `${logSymbols.success} ${customFileChecks.css.name} has ${include.content.join(\", \")}`\n            )\n            continue\n          }\n          yield* Effect.logDebug(\n            `${logSymbols.error} ${customFileChecks.css.name} missing ${include.content.join(\", \")}`\n          )\n          missingIncludes.push({ ...include, fileName: customFileChecks.css.name })\n        }\n\n        // Check Nativewind env or Uniwind types file\n        if (componentJson.tsx !== false) {\n          const missingTypeFiles: Array<CustomFileCheck> = []\n\n          if (stylingLibrary === \"nativewind\") {\n            const nativewindEnvContent = yield* fs\n              .readFileString(path.join(options.cwd, PROJECT_MANIFEST.nativewindEnvFile))\n              .pipe(\n                Effect.catchAll(() => {\n                  missingTypeFiles.push(customFileChecks.nativewindEnv)\n                  return Effect.succeed(null)\n                })\n              )\n\n            if (nativewindEnvContent) {\n              for (const include of customFileChecks.nativewindEnv.includes) {\n                if (include.content.every((str) => nativewindEnvContent.includes(str))) {\n                  yield* Effect.logDebug(\n                    `${logSymbols.success} ${customFileChecks.nativewindEnv.name} has ${include.content.join(\", \")}`\n                  )\n                  continue\n                }\n                yield* Effect.logDebug(\n                  `${logSymbols.error} ${customFileChecks.nativewindEnv.name} missing ${include.content.join(\", \")}`\n                )\n                missingIncludes.push({ ...include, fileName: customFileChecks.nativewindEnv.name })\n              }\n            }\n          }\n\n          if (stylingLibrary === \"uniwind\") {\n            // Get uniwind dts path from metro config (supports custom dtsFile)\n            const uniwindDtsPath = yield* projectConfig.getUniwindDtsPath()\n            const uniwindTypesContent: string | null = uniwindDtsPath\n              ? yield* fs.readFileString(uniwindDtsPath).pipe(\n                Effect.catchAll(() => {\n                  missingTypeFiles.push(customFileChecks.uniwindTypes)\n                  return Effect.succeed(null)\n                })\n              )\n              : null\n\n            if (uniwindTypesContent) {\n              for (const include of customFileChecks.uniwindTypes.includes) {\n                if (include.content.every((str) => uniwindTypesContent.includes(str))) {\n                  yield* Effect.logDebug(\n                    `${logSymbols.success} ${customFileChecks.uniwindTypes.name} has ${include.content.join(\", \")}`\n                  )\n                  continue\n                }\n                yield* Effect.logDebug(\n                  `${logSymbols.error} ${customFileChecks.uniwindTypes.name} missing ${include.content.join(\", \")}`\n                )\n                missingIncludes.push({ ...include, fileName: customFileChecks.uniwindTypes.name })\n              }\n            }\n          }\n\n          if (missingTypeFiles.length === 2) {\n            missingFiles.push(missingTypeFiles[0], missingTypeFiles[1])\n          }\n        }\n\n        if (stylingLibrary === \"nativewind\") {\n          // Check Tailwind config\n          const tailwindConfigPaths = [\n            componentJson.tailwind.config,\n            \"tailwind.config.js\",\n            \"tailwind.config.ts\"\n          ].filter((p) => p != null)\n          const tailwindConfigContent = yield* retryWith(\n            (filePath: string) =>\n              Effect.gen(function* () {\n                const content = yield* fs.readFileString(filePath)\n                yield* Effect.logDebug(`${logSymbols.success} ${customFileChecks.tailwindConfig.name} found`)\n                return content\n              }),\n            tailwindConfigPaths.map((p) => path.join(options.cwd, p)) as [string, ...Array<string>]\n          ).pipe(\n            Effect.catchAll(() => {\n              console.warn(\n                `${logSymbols.warning} Tailwind config not found, Please follow the instructions at https://www.nativewind.dev/docs/getting-started/installation#installation-with-expo`);\n              return Effect.succeed(\"\")\n            })\n          )\n\n          for (const include of customFileChecks.tailwindConfig.includes) {\n            if (include.content.every((str) => tailwindConfigContent.includes(str))) {\n              yield* Effect.logDebug(\n                `${logSymbols.success} ${customFileChecks.tailwindConfig.name} has ${include.content.join(\", \")}`\n              )\n              continue\n            }\n            yield* Effect.logDebug(\n              `${logSymbols.error} ${customFileChecks.tailwindConfig.name} missing ${include.content.join(\", \")}`\n            )\n            missingIncludes.push({ ...include, fileName: customFileChecks.tailwindConfig.name })\n          }\n        }\n\n        // Check theme file\n        const themeAliasPath = yield* projectConfig.resolvePathFromAlias(`${aliasForLib}/theme.ts`)\n        const themeContent = yield* fs.readFileString(themeAliasPath).pipe(\n          Effect.catchAll(() => {\n            missingFiles.push(customFileChecks.theme)\n            return Effect.succeed(null)\n          })\n        )\n\n        if (themeContent) {\n          for (const include of customFileChecks.theme.includes) {\n            if (include.content.every((str) => themeContent.includes(str))) {\n              yield* Effect.logDebug(\n                `${logSymbols.success} ${customFileChecks.theme.name} has ${include.content.join(\", \")}`\n              )\n              continue\n            }\n            yield* Effect.logDebug(\n              `${logSymbols.error} ${customFileChecks.theme.name} missing ${include.content.join(\", \")}`\n            )\n            missingIncludes.push({ ...include, fileName: customFileChecks.theme.name })\n          }\n        } else {\n          yield* Effect.logDebug(`${logSymbols.error} ${customFileChecks.theme.name} not found`)\n        }\n\n        // Check utils file\n        const utilsPath = yield* projectConfig.resolvePathFromAlias(`${aliasForLib}/utils.ts`)\n        const utilsContent = yield* fs.readFileString(utilsPath).pipe(\n          Effect.catchAll(() => {\n            missingFiles.push(customFileChecks.utils)\n            return Effect.succeed(null)\n          })\n        )\n\n        if (utilsContent) {\n          for (const include of customFileChecks.utils.includes) {\n            if (include.content.every((str) => utilsContent.includes(str))) {\n              yield* Effect.logDebug(\n                `${logSymbols.success} ${customFileChecks.utils.name} has ${include.content.join(\", \")}`\n              )\n              continue\n            }\n            yield* Effect.logDebug(\n              `${logSymbols.error} ${customFileChecks.utils.name} missing ${include.content.join(\", \")}`\n            )\n            missingIncludes.push({ ...include, fileName: customFileChecks.utils.name })\n          }\n        } else {\n          yield* Effect.logDebug(`${logSymbols.error} ${customFileChecks.utils.name} not found`)\n        }\n\n        return { missingFiles, missingIncludes }\n      })\n\n    return {\n      run: ({\n        customFileChecks,\n        deprecatedFromLib,\n        deprecatedFromUi,\n        fileChecks,\n        stylingLibrary\n      }: {\n        fileChecks: Array<FileCheck>\n        customFileChecks: Record<string, CustomFileCheck>\n        deprecatedFromLib: Array<Omit<FileCheck, \"docs\" | \"stylingLibraries\">>\n        deprecatedFromUi: Array<Omit<FileCheck, \"docs\" | \"stylingLibraries\">>\n        stylingLibrary: \"nativewind\" | \"uniwind\"\n      }) =>\n        Effect.gen(function* () {\n          const [fileResults, customFileResults, deprecatedFileResults] = yield* Effect.all([\n            checkFiles(fileChecks, stylingLibrary),\n            checkCustomFiles(customFileChecks, stylingLibrary),\n            checkDeprecatedFiles(deprecatedFromLib, deprecatedFromUi)\n          ])\n\n          return { fileResults, customFileResults, deprecatedFileResults }\n        })\n    }\n  })\n}) { }\n\nexport { RequiredFilesChecker }\n"
  },
  {
    "path": "apps/cli/src/services/spinner.ts",
    "content": "import { Effect } from \"effect\"\nimport ora from \"ora\"\n\nclass Spinner extends Effect.Service<Spinner>()(\"Spinner\", {\n  effect: Effect.gen(function* () {\n    const spinner = yield* Effect.try({\n      try: () => ora(),\n      catch: () => new Error(\"Failed to create spinner\")\n    })\n\n    return spinner\n  })\n}) {}\n\nexport { Spinner }\n"
  },
  {
    "path": "apps/cli/src/services/template.ts",
    "content": "import { runCommand } from \"@cli/utils/run-command.js\"\nimport { Prompt } from \"@effect/cli\"\nimport { FileSystem, Path } from \"@effect/platform\"\nimport { Effect } from \"effect\"\nimport { Spinner } from \"@cli/services/spinner.js\"\nimport logSymbols from \"log-symbols\"\n\nclass Template extends Effect.Service<Template>()(\"src/services/template\", {\n  dependencies: [Spinner.Default],\n  effect: Effect.gen(function* () {\n    const fs = yield* FileSystem.FileSystem\n    const path = yield* Path.Path\n    const spinner = yield* Spinner\n\n    return {\n      clone: ({ cwd, name, repo }: { cwd: string; name: string; repo: { subPath?: string; url: string } }) =>\n        Effect.acquireUseRelease(\n          fs.makeTempDirectory(),\n          (tempDirPath) =>\n            Effect.gen(function* () {\n              yield* Effect.logDebug(`Template.clone args: ${JSON.stringify({ cwd, name, repo }, null, 2)}`)\n\n              const newRepoPath = path.join(cwd, name)\n\n              const newRepoPathExists = yield* fs.exists(newRepoPath)\n\n              yield* Effect.logDebug(`Does ${newRepoPath} exist? ${newRepoPathExists ? \"yes\" : \"no\"}`)\n\n              if (newRepoPathExists) {\n                yield* Effect.logWarning(`${logSymbols.warning} A project already exists in this directory.`)\n                const choice = yield* Prompt.select({\n                  message: \"How would you like to proceed?\",\n                  choices: [\n                    { title: \"Cancel and exit\", value: \"cancel\" },\n                    { title: \"Overwrite the existing project\", value: \"overwrite\" }\n                  ]\n                })\n\n                if (choice === \"cancel\") {\n                  yield* Effect.logDebug(`User chose to cancel`)\n                  return yield* Effect.succeed(true)\n                }\n\n                const confirmOverwrite = yield* Prompt.confirm({\n                  message: \"Are you sure you want to overwrite the existing project?\",\n                  initial: true\n                })\n\n                if (!confirmOverwrite) {\n                  yield* Effect.logDebug(`User chose to not overwrite the existing project`)\n                  return yield* Effect.succeed(true)\n                }\n              }\n\n              yield* Effect.logDebug(`Created temp directory: ${tempDirPath}`)\n\n              const templateName = repo.subPath\n                ? path.basename(repo.subPath)\n                : path.basename(repo.url).replace(\".git\", \"\")\n\n              spinner.start(`Initializing the ${templateName} template...`)\n              yield* runCommand(\"git\", [\"clone\", \"--depth=1\", \"--branch\", \"main\", repo.url, name], {\n                cwd: tempDirPath\n              })\n\n              const cloneToTempPath = path.join(tempDirPath, name)\n\n              yield* Effect.logDebug(`Cloned temp template to ${cloneToTempPath}`)\n\n              yield* fs.copy(repo.subPath ? path.join(cloneToTempPath, repo.subPath) : cloneToTempPath, newRepoPath, {\n                overwrite: true\n              })\n\n              yield* Effect.logDebug(`Copied template to ${newRepoPath}`)\n\n              const allPaths = yield* fs.readDirectory(newRepoPath, { recursive: true })\n\n              yield* Effect.logDebug(`Replacing template name ${templateName} with ${name} in ${allPaths.length} files`)\n              yield* Effect.logDebug(`All paths: ${allPaths.join(\"\\n\")}`)\n\n              yield* Effect.forEach(allPaths, (file) =>\n                Effect.gen(function* () {\n                  const content = yield* fs\n                    .readFileString(path.join(newRepoPath, file))\n                    .pipe(Effect.catchAll(() => Effect.succeed(\"\")))\n\n                  if (!content.includes(templateName)) {\n                    return\n                  }\n\n                  yield* Effect.logDebug(`Replacing template name \"${templateName}\" with \"${name}\" in ${file}`)\n\n                  const replaced = content.replaceAll(templateName, name)\n                  yield* fs.writeFileString(path.join(newRepoPath, file), replaced)\n                })\n              )\n\n              spinner.stop()\n\n              const installDependencies = yield* Prompt.confirm({\n                message: \"Would you like to install dependencies?\",\n                initial: true\n              })\n              let packageManager = \"none\"\n              if (installDependencies) {\n                packageManager = yield* Prompt.select({\n                  message: \"Which package manager would you like to use?\",\n                  choices: [\n                    { title: \"bun\", value: \"bun\" },\n                    { title: \"pnpm\", value: \"pnpm\" },\n                    { title: \"npm\", value: \"npm\" },\n                    { title: \"yarn\", value: \"yarn\" }\n                  ]\n                })\n\n                const npmrcPath = path.join(newRepoPath, \".npmrc\")\n                const hasNpmrc = yield* fs.exists(npmrcPath)\n\n                if (packageManager === \"pnpm\" && !hasNpmrc) {\n                  yield* Effect.logDebug(`Writing .npmrc file...`)\n                  yield* fs.writeFileString(npmrcPath, \"node-linker=hoisted\\nenable-pre-post-scripts=true\")\n                }\n\n                if (packageManager !== \"pnpm\" && packageManager !== \"none\" && hasNpmrc) {\n                  yield* Effect.logDebug(`Removing .npmrc file...`)\n                  yield* fs.remove(npmrcPath)\n                }\n\n                yield* runCommand(packageManager, [\"install\"], {\n                  cwd: newRepoPath,\n                  stdio: \"inherit\"\n                })\n\n                yield* runCommand(\"npx\", [\"expo\", \"install\", \"--fix\"], {\n                  cwd: newRepoPath,\n                  stdio: \"inherit\"\n                })\n              }\n\n              const gitInit = yield* Prompt.confirm({\n                message: \"Would you like to initialize a Git repository?\",\n                initial: true\n              })\n\n              if (gitInit) {\n                spinner.start(`Initializing Git repository...`)\n\n                let hasGitError = false\n                yield* runCommand(\"git\", [\"init\"], {\n                  cwd: newRepoPath,\n                  stdio: \"inherit\"\n                }).pipe(\n                  Effect.catchAll(() => {\n                    hasGitError = true\n                    return Effect.succeed(true)\n                  })\n                )\n\n                if (!hasGitError) {\n                  yield* runCommand(\"git\", [\"add\", \"-A\"], {\n                    cwd: newRepoPath,\n                    stdio: \"inherit\"\n                  }).pipe(\n                    Effect.catchAll(() => {\n                      hasGitError = true\n                      return Effect.succeed(true)\n                    })\n                  )\n                }\n\n                if (!hasGitError) {\n                  yield* runCommand(\"git\", [\"commit\", \"-m\", \"initialize project with @react-native-reusables/cli\"], {\n                    cwd: newRepoPath,\n                    stdio: \"inherit\"\n                  }).pipe(Effect.catchAll(() => Effect.succeed(true)))\n                }\n                spinner.stop()\n              }\n\n              console.log(\"\\n\")\n              yield* Effect.log(`\\x1b[37m${logSymbols.success} New project initialized successfully!\\x1b[0m`)\n              if (packageManager !== \"none\") {\n                yield* Effect.log(\n                  `\\x1b[22m\\x1b[38;5;250m${logSymbols.info} To get started, run: \\x1b[37m\\`cd ${path.join(\n                    cwd,\n                    name\n                  )} && ${packageManager} ${\n                    packageManager === \"npm\" || packageManager === \"bun\" ? \"run\" : \"\"\n                  } dev\\`\\x1b[0m`\n                )\n              }\n\n              if (packageManager === \"none\") {\n                yield* Effect.log(`\\x1b[22m\\x1b[38;5;250m${logSymbols.info} To get started:\\x1b[0m`)\n                yield* Effect.log(\n                  \"\\x1b[22m\\x1b[38;5;250m↪ Install the dependencies manually using your package manager of choice.\\x1b[0m\"\n                )\n                yield* Effect.log(\"\\x1b[22m\\x1b[38;5;250m↪ Run the dev script.\\x1b[0m\")\n              }\n              console.log(\"\\n\")\n              yield* Effect.log(`\\x1b[37m${logSymbols.info} Additional resources\\x1b[0m`)\n              yield* Effect.log(\n                `\\x1b[22m\\x1b[38;5;250m↪ Documentation: \\x1b[37mhttps://reactnativereusables.com\\x1b[0m`\n              )\n              yield* Effect.log(\n                `\\x1b[22m\\x1b[38;5;250m↪ Report issues: \\x1b[37mhttps://github.com/founded-labs/react-native-reusables/issues\\x1b[0m`\n              )\n\n              return newRepoPath\n            }),\n          (tempDirPath) => {\n            spinner.stop()\n            return fs\n              .remove(tempDirPath, { recursive: true })\n              .pipe(Effect.catchAll(() => Effect.logError(`Failed to remove temp directory at ${tempDirPath}`)))\n          }\n        )\n    }\n  })\n}) {}\n\nexport { Template }\n"
  },
  {
    "path": "apps/cli/src/utils/retry-with.ts",
    "content": "import { Effect } from \"effect\"\n\nconst retryWith = <A, R, E, B>(\n  fn: (input: A) => Effect.Effect<R, E, B>,\n  inputs: readonly [A, ...Array<A>]\n): Effect.Effect<R, E, B> =>\n  inputs.slice(1).reduce((acc, input) => acc.pipe(Effect.orElse(() => fn(input))), fn(inputs[0]))\n\nexport { retryWith }\n"
  },
  {
    "path": "apps/cli/src/utils/run-command.ts",
    "content": "import { Effect } from \"effect\"\nimport { execa } from \"execa\"\n\nconst runCommand = (file: string, args: Array<string>, options: Parameters<typeof execa>[1]) =>\n  Effect.tryPromise({\n    try: () => execa(file, args, options),\n    catch: (error) => new Error(`Failed to run command: ${file} ${args.join(\" \")}`, { cause: String(error) })\n  })\n\nexport { runCommand }\n"
  },
  {
    "path": "apps/cli/test/Dummy.test.ts",
    "content": "import { describe, expect, it } from \"@effect/vitest\"\n\ndescribe(\"Dummy\", () => {\n  it(\"should pass\", () => {\n    expect(true).toBe(true)\n  })\n})\n"
  },
  {
    "path": "apps/cli/tsconfig.base.json",
    "content": "{\n  \"include\": [],\n  \"compilerOptions\": {\n    \"strict\": true,\n    \"moduleDetection\": \"force\",\n    \"composite\": true,\n    \"downlevelIteration\": true,\n    \"resolveJsonModule\": true,\n    \"esModuleInterop\": false,\n    \"declaration\": true,\n    \"skipLibCheck\": true,\n    \"exactOptionalPropertyTypes\": true,\n    \"emitDecoratorMetadata\": false,\n    \"experimentalDecorators\": true,\n    \"moduleResolution\": \"NodeNext\",\n    \"lib\": [\n      \"ES2022\",\n      \"DOM\"\n    ],\n    \"isolatedModules\": true,\n    \"sourceMap\": true,\n    \"declarationMap\": true,\n    \"noImplicitReturns\": false,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": false,\n    \"noFallthroughCasesInSwitch\": true,\n    \"noEmitOnError\": false,\n    \"noErrorTruncation\": false,\n    \"allowJs\": false,\n    \"checkJs\": false,\n    \"forceConsistentCasingInFileNames\": true,\n    \"stripInternal\": true,\n    \"noImplicitAny\": true,\n    \"noImplicitThis\": true,\n    \"noUncheckedIndexedAccess\": false,\n    \"strictNullChecks\": true,\n    \"baseUrl\": \".\",\n    \"target\": \"ES2022\",\n    \"module\": \"NodeNext\",\n    \"incremental\": true,\n    \"removeComments\": false,\n    \"plugins\": [\n      {\n        \"name\": \"@effect/language-service\"\n      }\n    ],\n    \"paths\": {\n      \"@cli/*\": [\n        \"./src/*\"\n      ]\n    }\n  }\n}"
  },
  {
    "path": "apps/cli/tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.base.json\",\n  \"references\": [\n    {\n      \"path\": \"tsconfig.src.json\"\n    },\n    {\n      \"path\": \"tsconfig.test.json\"\n    },\n    {\n      \"path\": \"tsconfig.scripts.json\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/cli/tsconfig.scripts.json",
    "content": "{\n  \"extends\": \"./tsconfig.base.json\",\n  \"include\": [\n    \"scripts\",\n    \"eslint.config.mjs\",\n    \"tsup.config.ts\",\n    \"vitest.config.ts\"\n  ],\n  \"compilerOptions\": {\n    \"types\": [\n      \"node\"\n    ],\n    \"tsBuildInfoFile\": \".tsbuildinfo/scripts.tsbuildinfo\",\n    \"rootDir\": \".\",\n    \"noEmit\": true\n  }\n}"
  },
  {
    "path": "apps/cli/tsconfig.src.json",
    "content": "{\n  \"extends\": \"./tsconfig.base.json\",\n  \"include\": [\"src\"],\n  \"compilerOptions\": {\n    \"types\": [\"node\"],\n    \"tsBuildInfoFile\": \".tsbuildinfo/src.tsbuildinfo\",\n    \"rootDir\": \"src\",\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "apps/cli/tsconfig.test.json",
    "content": "{\n  \"extends\": \"./tsconfig.base.json\",\n  \"include\": [\"test\"],\n  \"compilerOptions\": {\n    \"types\": [\"node\"],\n    \"tsBuildInfoFile\": \".tsbuildinfo/test.tsbuildinfo\",\n    \"rootDir\": \"test\",\n    \"noEmit\": true\n  }\n}\n"
  },
  {
    "path": "apps/cli/tsup.config.ts",
    "content": "import { defineConfig } from \"tsup\"\n\nexport default defineConfig({\n  entry: [\"src/bin.ts\"],\n  clean: true,\n  publicDir: true,\n  treeshake: \"smallest\",\n  external: [\"@parcel/watcher\"]\n})\n"
  },
  {
    "path": "apps/cli/vitest.config.ts",
    "content": "import { defineConfig } from \"vitest/config\"\n\nexport default defineConfig({\n  test: {\n    include: [\"./test/**/*.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}\"],\n    exclude: [],\n    globals: true,\n    coverage: {\n      provider: \"v8\"\n    }\n  }\n})\n"
  },
  {
    "path": "apps/docs/.eslintrc.json",
    "content": "{\n  \"extends\": [\"next/core-web-vitals\", \"next/typescript\"]\n}\n"
  },
  {
    "path": "apps/docs/.gitignore",
    "content": "# deps\n/node_modules\n\n# generated content\n.contentlayer\n.content-collections\n.source\n\n# test & build\n/coverage\n/.next/\n/out/\n/build\n*.tsbuildinfo\n/dist\n\n# misc\n.DS_Store\n*.pem\n/.pnp\n.pnp.js\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# others\n.env*.local\n.vercel\nnext-env.d.ts\n\n# local registry\npublic/local\nregistry/nativewind.local.json\nregistry/uniwind.local.json"
  },
  {
    "path": "apps/docs/README.md",
    "content": "# docs\n\nThis is a Next.js application generated with\n[Create Fumadocs](https://github.com/fuma-nama/fumadocs).\n\nRun development server:\n\n```bash\nnpm run dev\n# or\npnpm dev\n# or\nyarn dev\n```\n\nOpen http://localhost:3000 with your browser to see the result.\n\n## Learn More\n\nTo learn more about Next.js and Fumadocs, take a look at the following\nresources:\n\n- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js\n  features and API.\n- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.\n- [Fumadocs](https://fumadocs.vercel.app) - learn about Fumadocs\n"
  },
  {
    "path": "apps/docs/app/(home)/BlockSection.tsx",
    "content": "import { Badge } from '@docs/components/ui/badge';\nimport { Button } from '@docs/components/ui/button';\nimport { Heart } from 'lucide-react';\nimport Link from 'next/link';\n\nexport default function BlocksSection() {\n  return (\n    <div className=\"flex w-full\">\n      <div className=\"flex w-1/3 flex-1 flex-col items-start gap-2 py-64\">\n        <Badge\n          variant=\"outline\"\n          className=\"bg-card dark:bg-secondary border-border/70 gap-1 pr-2 font-normal shadow-sm\">\n          <Heart className=\"size-3\" />\n          Sponsored by Clerk\n        </Badge>\n        <h1 className=\"text-foreground/90 w-full text-2xl font-semibold\">Authentication Blocks</h1>\n        <Button asChild size=\"sm\">\n          <Link href=\"/docs\">Explore all Blocks</Link>\n        </Button>\n      </div>\n      <div className=\"relative w-2/3 overflow-hidden bg-red-500 [mask-image:radial-gradient(circle_at_center,red,#0000)]\">\n        <div className=\"absolute left-1/2 top-1/2 flex w-[90rem] -translate-x-1/2 -translate-y-1/2 flex-wrap justify-center gap-4\">\n          <div className=\"h-96 w-96 rounded-2xl bg-neutral-900\" />\n          <div className=\"h-96 w-96 rounded-2xl bg-neutral-900\" />\n          <div className=\"h-96 w-96 rounded-2xl bg-neutral-900\" />\n          <div className=\"h-96 w-96 rounded-2xl bg-neutral-900\" />\n          <div className=\"h-96 w-96 rounded-2xl bg-neutral-900\" />\n          <div className=\"h-96 w-96 rounded-2xl bg-neutral-900\" />\n          <div className=\"h-96 w-96 rounded-2xl bg-neutral-900\" />\n          <div className=\"h-96 w-96 rounded-2xl bg-neutral-900\" />\n        </div>\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "apps/docs/app/(home)/ComponentsGrid.tsx",
    "content": "'use client';\nimport {\n  AccordionPreview,\n  AlertDialogPreview,\n  AlertPreview,\n  AspectRatioPreview,\n  AvatarPreview,\n  BadgePreview,\n  ButtonPreview,\n  // CardPreview,\n  CheckboxPreview,\n  CollapsiblePreview,\n  DialogPreview,\n  DropdownMenuPreview,\n  HoverCardPreview,\n  InputPreview,\n  LabelPreview,\n  MenubarPreview,\n  PopoverPreview,\n  ProgressPreview,\n  RadioGroupPreview,\n  SelectPreview,\n  // SeparatorPreview,\n  // SkeletonPreview,\n  SwitchPreview,\n  TabsPreview,\n  // TextPreview,\n  TextareaPreview,\n  // TogglePreview,\n  ToggleGroupPreview,\n  TooltipPreview,\n} from '@docs/components/examples';\nimport { useIsDarkMode } from '@docs/components/preview-card';\nimport Image from 'next/image';\nimport { QRCodeSVG } from 'qrcode.react';\nimport * as React from 'react';\n\nexport default function ComponentsGrid() {\n  const isDark = useIsDarkMode();\n  const [nativePreview, setNativePreview] = React.useState(false);\n\n  return (\n    <div className=\"flex flex-col gap-4 max-2xl:px-4\">\n      <div className=\"hidden w-fit sm:block\">\n        <div className=\"bg-fd-background relative flex items-center gap-1 rounded-md border py-0.5 pl-2.5 pr-0.5 text-xs\">\n          <span className=\"text-muted-foreground\">Platform:</span>{' '}\n          <button\n            className={`cursor-pointer rounded-sm border px-1.5 py-1 duration-150 ${!nativePreview ? 'bg-white shadow dark:bg-neutral-800' : 'hover:bg-fd-accent/70 border-transparent'}`}\n            onClick={() => setNativePreview(false)}>\n            Web\n          </button>\n          <button\n            className={`cursor-pointer rounded-sm border px-1.5 py-1 duration-150 ${nativePreview ? 'bg-white shadow dark:bg-neutral-800' : 'hover:bg-fd-accent/70 border-transparent'}`}\n            onClick={() => setNativePreview(true)}>\n            Native\n          </button>\n          <div\n            className={`absolute left-0 top-10 z-20 flex max-w-sm flex-col items-center gap-6 rounded-lg border border-dashed bg-white p-4 shadow-xl duration-100 dark:bg-black ${nativePreview ? 'translate-y-0 opacity-100 blur-0' : 'pointer-events-none -translate-y-2 opacity-0 blur-md'}`}>\n            <QRCodeSVG\n              value=\"https://reactnativereusables.com/showcase/links/home-screen\"\n              bgColor={isDark ? 'black' : 'white'}\n              fgColor={isDark ? 'white' : 'black'}\n              size={230}\n              level=\"H\"\n            />\n            <p className=\"text-center font-mono text-sm\">Scan to preview.</p>\n          </div>\n        </div>\n      </div>\n      <div className=\"sm:hidden\" />\n\n      <Image\n        src=\"/mobile-component-previews/default_dark.png\"\n        alt=\"Components Grid\"\n        width={2520}\n        height={1704}\n        className=\"hidden rounded-lg md:hidden max-md:dark:block\"\n      />\n      <Image\n        src=\"/mobile-component-previews/default_light.png\"\n        alt=\"Components Grid\"\n        width={2520}\n        height={1704}\n        className=\"rounded-lg md:hidden dark:hidden\"\n      />\n\n      <div className=\"dark:from-fd-background dark:to-fd-accent/70 to-fd-accent relative flex w-full flex-wrap overflow-clip rounded-lg border border-dashed bg-gradient-to-bl from-white max-md:hidden\">\n        <div className=\"flex w-full flex-wrap items-center border-b\">\n          <div className=\"border-r p-4\">\n            <HoverCardPreview />\n          </div>\n          <div className=\"flex justify-end border-r p-4\">\n            <SelectPreview />\n          </div>\n          <div className=\"flex justify-center border-r p-4\">\n            <MenubarPreview />\n          </div>\n          <div className=\"flex w-full flex-1 items-center justify-center border-r p-4 max-xl:hidden\">\n            <ProgressPreview />\n          </div>\n          <div className=\"border-r p-4\">\n            <ToggleGroupPreview />\n          </div>\n          <div className=\"ml-auto flex justify-center p-4 max-[857px]:hidden xl:border-r\">\n            <ButtonPreview />\n          </div>\n          <div className=\"p-4 max-xl:hidden\">\n            <AvatarPreview />\n          </div>\n        </div>\n        <div className=\"flex max-xl:flex-col max-lg:flex-1\">\n          <div className=\"border-r lg:w-[572.5px] xl:flex-1\">\n            <div className=\"relative p-4\">\n              <CheckboxPreview />\n            </div>\n            <div className=\"relative border-t px-6\">\n              <AccordionPreview />\n            </div>\n            <div className=\"relative border-t p-4\">\n              <AlertPreview />\n            </div>\n          </div>\n          <div className=\"w-full border-r xl:w-[400px]\">\n            {/* <div className=\"flex w-full justify-center p-4 py-10\">\n              <ContextMenuPreview /> \n            </div> */}\n            <div className=\"p-5 max-lg:hidden\">\n              <BadgePreview />\n            </div>\n            <div className=\"border-t p-4 max-xl:hidden\">\n              <CollapsiblePreview />\n            </div>\n            <div className=\"border-t p-4\">\n              <TabsPreview />\n            </div>\n            <div className=\"border-t p-5 max-xl:hidden\">\n              <SwitchPreview />\n            </div>\n            <div className=\"border-t p-5 max-xl:hidden\">\n              <RadioGroupPreview />\n            </div>\n          </div>\n        </div>\n        <div className=\"w-full flex-1\">\n          <div className=\"flex w-full justify-end border-b p-4 xl:hidden\">\n            <AvatarPreview />\n          </div>\n          <div className=\"p-4\">\n            <AspectRatioPreview />\n          </div>\n          <div className=\"border-t p-4 xl:hidden\">\n            <ProgressPreview />\n          </div>\n          <div className=\"border-t p-4\">\n            <InputPreview />\n          </div>\n          <div className=\"border-t p-4\">\n            <TextareaPreview />\n          </div>\n          <div className=\"border-t p-4\">\n            <LabelPreview />\n          </div>\n\n          <div className=\"border-t p-4\">\n            <AlertDialogPreview />\n          </div>\n          <div className=\"border-t p-4\">\n            <DialogPreview />\n          </div>\n          <div className=\"border-t p-4\">\n            <PopoverPreview />\n          </div>\n          <div className=\"border-t p-4\">\n            <TooltipPreview />\n          </div>\n          <div className=\"border-t p-4\">\n            <DropdownMenuPreview />\n          </div>\n\n          <div className=\"hidden border-t p-5 max-xl:block\">\n            <SwitchPreview />\n          </div>\n          <div className=\"hidden border-t p-5 max-xl:block\">\n            <RadioGroupPreview />\n          </div>\n          <div className=\"hidden border-t p-4 max-xl:block\">\n            <CollapsiblePreview />\n          </div>\n          <div className=\"hidden p-5 max-lg:block\">\n            <BadgePreview />\n          </div>\n          <div className=\"ml-auto hidden justify-center border-t p-4 max-[857px]:flex\">\n            <ButtonPreview />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "apps/docs/app/(home)/TemplatesSection.tsx",
    "content": "import { Badge } from '@docs/components/ui/badge';\nimport { Button } from '@docs/components/ui/button';\nimport { BatteryCharging } from 'lucide-react';\nimport Link from 'next/link';\n\nexport default function TemplatesSection() {\n  return (\n    <div className=\"flex w-full\">\n      <div className=\"flex w-1/3 flex-1 flex-col items-start gap-2 py-64\">\n        <Badge\n          variant=\"outline\"\n          className=\"bg-card dark:bg-secondary border-border/70 gap-1 pr-2 font-normal shadow-sm\">\n          <BatteryCharging className=\"size-3\" />\n          Batteries Included!\n        </Badge>\n        <h1 className=\"text-foreground/90 w-full text-2xl font-semibold\">\n          Authentication Template\n        </h1>\n        <p className=\"text-foreground/80 max-w-3xl text-balance text-base sm:text-lg\">\n          A complete authentication solution for your app, including sign-up, sign-in, and user\n          management. Powered by Clerk, this template provides a seamless user experience with\n          pre-built components and flows.\n        </p>\n        <Button asChild size=\"sm\">\n          <Link href=\"/docs\">Add it to your app</Link>\n        </Button>\n      </div>\n      <div className=\"relative w-2/3 overflow-hidden bg-red-500\"></div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "apps/docs/app/(home)/layout.tsx",
    "content": "import { RnrIcon } from '@docs/components/icons/rnr-icon';\nimport { SkipNavigationButton } from '@docs/components/skip-navigation-button';\nimport { Button } from '@docs/components/ui/button';\nimport { HomeLayout } from 'fumadocs-ui/layouts/home';\nimport type { Metadata } from 'next';\nimport Link from 'next/link';\nimport type { ReactNode } from 'react';\n\nexport const metadata: Metadata = {\n  title: 'React Native Reusables',\n  description:\n    'Bringing shadcn/ui to React Native. Beautifully crafted components with Nativewind or Uniwind, open source, and almost as easy to use.',\n};\n\nexport default function Layout({ children }: { children: ReactNode }) {\n  return (\n    <>\n      <SkipNavigationButton />\n      <HomeLayout\n        githubUrl=\"https://github.com/founded-labs/react-native-reusables\"\n        className=\"dark:from-fd-background dark:to-fd-background from-fd-accent bg-gradient-to-b to-white\"\n        nav={{\n          title: (\n            <div className=\"hover:bg-fd-accent -ml-0.5 flex size-8 items-center justify-center rounded-md transition-colors duration-200\">\n              <RnrIcon className=\"w-6\" pathClassName=\"stroke-[1px]\" />\n            </div>\n          ),\n        }}\n        links={[\n          {\n            type: 'custom',\n            children: (\n              <Button\n                variant=\"ghost\"\n                size=\"sm\"\n                asChild\n                className=\"hover:bg-fd-accent dark:hover:bg-fd-accent -ml-1.5 justify-start sm:ml-0 sm:justify-center\">\n                <Link href=\"/docs\">Docs</Link>\n              </Button>\n            ),\n          },\n          {\n            type: 'custom',\n            children: (\n              <Button\n                variant=\"ghost\"\n                size=\"sm\"\n                asChild\n                className=\"hover:bg-fd-accent dark:hover:bg-fd-accent -ml-1.5 justify-start sm:ml-0 sm:justify-center\">\n                <Link href=\"/docs/blocks/authentication\">Blocks</Link>\n              </Button>\n            ),\n          },\n          {\n            type: 'custom',\n            children: (\n              <Button\n                variant=\"ghost\"\n                size=\"sm\"\n                asChild\n                className=\"hover:bg-fd-accent dark:hover:bg-fd-accent -ml-1.5 justify-start sm:ml-0 sm:justify-center\">\n                <Link href=\"/docs/components/accordion\">Components</Link>\n              </Button>\n            ),\n          },\n        ]}>\n        {children}\n      </HomeLayout>\n    </>\n  );\n}\n"
  },
  {
    "path": "apps/docs/app/(home)/page.tsx",
    "content": "import { Badge } from '@docs/components/ui/badge';\nimport { Button } from '@docs/components/ui/button';\nimport { ArrowRightIcon } from 'lucide-react';\nimport Link from 'next/link';\nimport { Footer } from '../docs/[[...slug]]/page';\nimport ComponentsGrid from './ComponentsGrid';\n\nexport default function HomePage() {\n  return (\n    <div className=\"flex flex-1 flex-col\">\n      <main\n        id=\"nd-page\"\n        className=\"max-w-fd-container mx-auto flex w-full flex-1 flex-col items-center gap-4 pt-4 md:pt-0\">\n        <div className=\"container relative z-0 flex flex-col items-center gap-2 py-8 text-center md:pt-16 lg:pt-20 xl:gap-4\">\n          <div className=\"bg-grid-print pointer-events-none absolute inset-0 -bottom-16 z-[-1] bg-white opacity-60 [mask-image:radial-gradient(ellipse_50%_100%_at_50%_100%,red,#0000)] dark:bg-neutral-800\" />\n          <div className=\"h-6\">\n            <Badge\n              variant=\"outline\"\n              asChild\n              className=\"bg-card dark:bg-secondary border-border/75 gap-1 rounded-full pr-2 font-normal\">\n              <Link href=\"/docs/blocks/authentication\">\n                New Authentication Blocks <ArrowRightIcon className=\"size-3\" />\n              </Link>\n            </Badge>\n          </div>\n          <h1 className=\"text-primary/90 leading-tighter max-w-3xl text-balance text-4xl font-semibold tracking-tight lg:leading-[1.1] xl:max-w-7xl xl:text-5xl xl:font-medium xl:tracking-tighter\">\n            Build your Universal Component Library\n          </h1>\n          <p className=\"text-foreground/80 max-w-3xl text-balance text-base sm:text-lg\">\n            Bringing{' '}\n            <a\n              href=\"https://ui.shadcn.com\"\n              target=\"_blank\"\n              className=\"decoration-fd-muted-foreground/0 hover:decoration-fd-muted-foreground underline underline-offset-4\">\n              shadcn/ui\n            </a>{' '}\n            to React Native. Beautifully crafted components with Nativewind or Uniwind, open source,\n            and <i>almost as easy to use.</i>\n          </p>\n          <div className=\"**:data-[slot=button]:shadow-none flex w-full items-center justify-center gap-2 pt-2\">\n            <Button asChild size=\"sm\">\n              <Link href=\"/docs\">Get Started</Link>\n            </Button>\n          </div>\n        </div>\n        <ComponentsGrid />\n      </main>\n      <Footer url=\"/\" />\n    </div>\n  );\n}\n"
  },
  {
    "path": "apps/docs/app/api/search/route.ts",
    "content": "import { source } from '@docs/lib/source';\nimport { createFromSource } from 'fumadocs-core/search/server';\n\nexport const { GET } = createFromSource(source);\n"
  },
  {
    "path": "apps/docs/app/docs/[[...slug]]/page.tsx",
    "content": "import { Button } from '@docs/components/ui/button';\nimport { source } from '@docs/lib/source';\nimport { cn } from '@docs/lib/utils';\nimport { findNeighbour } from 'fumadocs-core/server';\nimport { CodeBlock, Pre } from 'fumadocs-ui/components/codeblock';\nimport defaultMdxComponents from 'fumadocs-ui/mdx';\nimport { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/page';\nimport { ArrowLeftIcon, ArrowRightIcon, ExternalLinkIcon } from 'lucide-react';\nimport Link from 'next/link';\nimport { notFound } from 'next/navigation';\n\nexport default async function Page(props: { params: Promise<{ slug?: string[] }> }) {\n  const params = await props.params;\n  const page = source.getPage(params.slug);\n  if (!page) notFound();\n\n  const MDX = page.data.body;\n\n  return (\n    <DocsPage\n      toc={page.data.toc}\n      full={page.data.full}\n      breadcrumb={{ enabled: false }}\n      tableOfContent={{\n        footer: <TableOfContentFooter />,\n      }}\n      footer={{\n        component: <Footer url={page.url} />,\n      }}>\n      <DocsBody>\n        <div className=\"flex items-center justify-between gap-2\">\n          <DocsTitle className=\"mb-0 font-semibold\">{page.data.title}</DocsTitle>\n          <NeighbourButtons url={page.url} />\n        </div>\n        <DocsDescription className=\"mb-4 mt-2.5 text-base\">{page.data.description}</DocsDescription>\n        <MDX\n          components={{\n            ...defaultMdxComponents,\n            h2: ({ className, ...props }) => (\n              <defaultMdxComponents.h2 className={cn(className, 'font-medium')} {...props} />\n            ),\n            //  HTML `ref` attribute conflicts with `forwardRef`\n            // eslint-disable-next-line @typescript-eslint/no-unused-vars\n            pre: ({ ref: _ref, className, ...props }) => (\n              <CodeBlock\n                {...props}\n                className={cn(\n                  className,\n                  'bg-fd-foreground/95 dark:bg-fd-secondary/50 text-background dark:text-foreground *:dark relative'\n                )}>\n                <Pre>{props.children}</Pre>\n              </CodeBlock>\n            ),\n            h3: ({ className, ...props }) => (\n              <h3 className={cn(className, 'mb-6 mt-10 scroll-mt-20 font-medium')} {...props} />\n            ),\n          }}\n        />\n      </DocsBody>\n    </DocsPage>\n  );\n}\n\nfunction NeighbourButtons({ url }: { url: string }) {\n  const neighbours = findNeighbour(source.pageTree, url);\n\n  const isManualInstallation = url === '/docs/installation/manual';\n\n  return (\n    <div className=\"flex items-center gap-2\">\n      {neighbours.previous || isManualInstallation ? (\n        <Button variant=\"outline\" size=\"icon\" className=\"border-border/70 size-8\" asChild>\n          <Link href={neighbours.previous?.url || '/docs'}>\n            <ArrowLeftIcon />\n          </Link>\n        </Button>\n      ) : null}\n      {neighbours.next || isManualInstallation ? (\n        <Button variant=\"outline\" size=\"icon\" className=\"border-border/70 size-8\" asChild>\n          <Link\n            href={neighbours.next?.url || '/docs/customization'}\n            target={\n              neighbours.next?.url.startsWith('https://foundedlabs.com') ? '_blank' : undefined\n            }>\n            <ArrowRightIcon />\n          </Link>\n        </Button>\n      ) : null}\n    </div>\n  );\n}\n\nexport function Footer({ url }: { url: string }) {\n  const neighbours = findNeighbour(source.pageTree, url);\n\n  const isManualInstallation = url === '/docs/installation/manual';\n\n  return (\n    <footer>\n      <div className=\"flex h-16 w-full items-center justify-between gap-2\">\n        {neighbours.previous || isManualInstallation ? (\n          <Button\n            variant=\"ghost\"\n            size=\"sm\"\n            asChild\n            className=\"bg-fd-accent hover:bg-fd-accent/80 dark:hover:bg-fd-accent/80\">\n            <Link href={neighbours.previous?.url || '/docs'}>\n              <ArrowLeftIcon />\n              {neighbours.previous?.name || 'Introduction'}\n            </Link>\n          </Button>\n        ) : (\n          <div />\n        )}\n        {neighbours.next || isManualInstallation ? (\n          <Button\n            variant=\"ghost\"\n            size=\"sm\"\n            asChild\n            className=\"bg-fd-accent hover:bg-fd-accent/80 dark:hover:bg-fd-accent/80\">\n            <Link href={neighbours.next?.url || '/docs/customization'}>\n              {neighbours.next?.name || 'Customization'}\n              <ArrowRightIcon />\n            </Link>\n          </Button>\n        ) : null}\n      </div>\n      <div className=\"flex h-20 items-center justify-between\">\n        <div className=\"text-fd-muted-foreground w-full text-balance px-4 text-center text-xs leading-loose lg:text-sm\">\n          Built by{' '}\n          <a\n            href=\"https://x.com/mrzachnugent\"\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            className=\"underline underline-offset-4\">\n            mrzachnugent\n          </a>{' '}\n          at{' '}\n          <a\n            href=\"https://foundedlabs.com\"\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            className=\"decoration-fd-muted-foreground/0 hover:decoration-fd-muted-foreground underline underline-offset-4\">\n            Founded Labs\n          </a>\n          , bringing{' '}\n          <a\n            href=\"https://ui.shadcn.com\"\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            className=\"underline underline-offset-4\">\n            shadcn/ui\n          </a>{' '}\n          to React Native. Source on{' '}\n          <a\n            href=\"https://github.com/founded-labs/react-native-reusables\"\n            target=\"_blank\"\n            rel=\"noreferrer\"\n            className=\"underline underline-offset-4\">\n            GitHub\n          </a>\n          .\n        </div>\n      </div>\n    </footer>\n  );\n}\n\nfunction TableOfContentFooter() {\n  return (\n    <div className=\"bg-card dark:bg-fd-muted border-border/50 text-fd-foreground/80 group relative mt-12 flex flex-col gap-2 overflow-clip rounded-lg border p-6 text-sm\">\n      <div className=\"text-balance text-base font-semibold leading-tight group-hover:underline\">\n        Want to work with us?\n      </div>\n      <div className=\"\">Mention us to your team.</div>\n      <div className=\"text-muted-foreground pb-2\">We help companies ship world-class UI/UX.</div>\n      <Button\n        size=\"sm\"\n        className=\"from-primary to-primary/75 group-hover:to-primary/80 relative w-fit bg-transparent bg-gradient-to-br duration-150 group-hover:pr-8\">\n        Learn more\n        <ExternalLinkIcon className=\"absolute right-2 top-1/2 size-3.5 -translate-x-1 -translate-y-1/2 scale-y-0 opacity-0 duration-100 group-hover:translate-x-0 group-hover:scale-y-100 group-hover:opacity-100\" />\n      </Button>\n      <Link href=\"https://foundedlabs.com\" target=\"_blank\" className=\"absolute inset-0\">\n        <span className=\"sr-only\">Learn more about Founded Labs</span>\n      </Link>\n    </div>\n  );\n}\n\nexport async function generateStaticParams() {\n  return source.generateParams();\n}\n\nexport async function generateMetadata(props: { params: Promise<{ slug?: string[] }> }) {\n  const params = await props.params;\n  const page = source.getPage(params.slug);\n  if (!page) notFound();\n\n  return {\n    title: page.data.title,\n    description: page.data.description,\n  };\n}\n"
  },
  {
    "path": "apps/docs/app/docs/layout.tsx",
    "content": "import { RnrIcon } from '@docs/components/icons/rnr-icon';\nimport { SkipNavigationButton } from '@docs/components/skip-navigation-button';\nimport { source } from '@docs/lib/source';\nimport { DocsLayout } from 'fumadocs-ui/layouts/notebook';\nimport type { ReactNode } from 'react';\n\nconst SIDEBAR_PROPS = { className: '[&>div]:pt-3' };\n\nexport default function Layout({ children }: { children: ReactNode }) {\n  return (\n    <>\n      <SkipNavigationButton />\n      <DocsLayout\n        tree={source.pageTree}\n        nav={{\n          title: (\n            <div className=\"text-foreground/80 -ml-px flex items-center gap-1.5 opacity-90 transition-opacity duration-200 hover:opacity-100\">\n              <div className=\"flex items-center justify-center\">\n                <RnrIcon />\n              </div>\n              <p className=\"text-base\">Reusables</p>\n            </div>\n          ),\n        }}\n        sidebar={SIDEBAR_PROPS}\n        githubUrl=\"https://github.com/founded-labs/react-native-reusables\">\n        {children}\n      </DocsLayout>\n    </>\n  );\n}\n"
  },
  {
    "path": "apps/docs/app/global.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n  :root {\n    --background: 0 0% 100%;\n    --foreground: 0 0% 3.9%;\n    --card: 0 0% 100%;\n    --card-foreground: 0 0% 3.9%;\n    --popover: 0 0% 100%;\n    --popover-foreground: 0 0% 3.9%;\n    --primary: 0 0% 9%;\n    --primary-foreground: 0 0% 98%;\n    --secondary: 0 0% 96.1%;\n    --secondary-foreground: 0 0% 9%;\n    --muted: 0 0% 96.1%;\n    --muted-foreground: 0 0% 45.1%;\n    --accent: 0 0% 96.1%;\n    --accent-foreground: 0 0% 9%;\n    --destructive: 0 84.2% 60.2%;\n    --border: 0 0% 89.8%;\n    --input: 0 0% 89.8%;\n    --ring: 0 0% 63%;\n    --radius: 0.625rem;\n    --chart-1: 12 76% 61%;\n    --chart-2: 173 58% 39%;\n    --chart-3: 197 37% 24%;\n    --chart-4: 43 74% 66%;\n    --chart-5: 27 87% 67%;\n  }\n\n  .dark {\n    --background: 0 0% 3.9%;\n    --foreground: 0 0% 98%;\n    --card: 0 0% 3.9%;\n    --card-foreground: 0 0% 98%;\n    --popover: 0 0% 3.9%;\n    --popover-foreground: 0 0% 98%;\n    --primary: 0 0% 98%;\n    --primary-foreground: 0 0% 9%;\n    --secondary: 0 0% 14.9%;\n    --secondary-foreground: 0 0% 98%;\n    --muted: 0 0% 14.9%;\n    --muted-foreground: 0 0% 63.9%;\n    --accent: 0 0% 14.9%;\n    --accent-foreground: 0 0% 98%;\n    --destructive: 0 70.9% 59.4%;\n    --border: 0 0% 14.9%;\n    --input: 0 0% 14.9%;\n    --ring: 300 0% 45%;\n    --chart-1: 220 70% 50%;\n    --chart-2: 160 60% 45%;\n    --chart-3: 30 80% 55%;\n    --chart-4: 280 65% 60%;\n    --chart-5: 340 75% 55%;\n  }\n}\n\n@layer base {\n  * {\n    @apply border-border outline-ring/50;\n  }\n  ::selection {\n    @apply bg-primary text-primary-foreground;\n  }\n  html {\n    @apply scroll-smooth;\n  }\n  body {\n    font-synthesis-weight: none;\n    text-rendering: optimizeLegibility;\n  }\n  #nd-page {\n    @apply scroll-mt-20;\n  }\n}\n\n.bg-grid-print {\n  background-image:\n    radial-gradient(circle at 0px 0px, rgb(119, 119, 119) 1.5px, rgba(0, 0, 0, 0) 0px),\n    radial-gradient(circle at 100% 100%, rgb(119, 119, 119) 1.5px, rgba(0, 0, 0, 0) 0px);\n  background-size: 20px 20px;\n  background-position:\n    0px 0px,\n    10px 10px;\n}\n\n.bg-grid-dots {\n  background-image: radial-gradient(\n    circle at 0px 0px,\n    rgb(119, 119, 119) 1.5px,\n    rgba(0, 0, 0, 0) 0px\n  );\n  background-size: 20px 20px;\n}\n\n.bg-grid-lines {\n  background-image:\n    linear-gradient(90deg, rgba(119, 119, 119, 0.5) 1px, transparent 1px),\n    linear-gradient(0deg, rgba(119, 119, 119, 0.5) 1px, transparent 1px);\n  background-size: 20px 20px;\n}\n"
  },
  {
    "path": "apps/docs/app/layout.tsx",
    "content": "import './global.css';\n\nimport { CookiesProvider } from '@docs/components/cookies-provider';\nimport { SafeAreaProvider } from '@docs/components/safe-area-provider';\nimport { cn } from '@docs/lib/utils';\nimport { Analytics } from '@vercel/analytics/next';\nimport type { SearchLink } from 'fumadocs-ui/components/dialog/search';\nimport { RootProvider } from 'fumadocs-ui/provider';\nimport { Geist, Geist_Mono } from 'next/font/google';\n\nconst fontSans = Geist({\n  subsets: ['latin'],\n  variable: '--font-sans',\n});\n\nconst fontMono = Geist_Mono({\n  subsets: ['latin'],\n  variable: '--font-mono',\n  weight: ['400'],\n});\n\nconst SEARCH_OPTIONS = {\n  links: [\n    ['Docs', '/docs/installation'],\n    ['Blocks', '/docs/blocks/authentication'],\n    ['Components', '/docs/components/accordion'],\n    ['Changelog', '/docs/changelog'],\n  ] satisfies SearchLink[],\n};\n\nexport default function Layout({ children }: React.PropsWithChildren) {\n  return (\n    <html lang=\"en\" className={cn(fontSans.variable, fontMono.variable)} suppressHydrationWarning>\n      <head>\n        <link rel=\"icon\" href=\"/favicon.svg\" />\n      </head>\n      <body className=\"flex min-h-svh flex-col\">\n        <CookiesProvider>\n          <SafeAreaProvider>\n            <RootProvider search={SEARCH_OPTIONS}>\n              {children}\n              <Analytics />\n            </RootProvider>\n          </SafeAreaProvider>\n        </CookiesProvider>\n      </body>\n    </html>\n  );\n}\n"
  },
  {
    "path": "apps/docs/app/og/route.tsx",
    "content": "import { ImageResponse } from 'next/og';\n\nasync function loadGoogleFont(weight: string, text: string) {\n  const url = `https://fonts.googleapis.com/css2?family=Geist:wght@${weight}&display=swap&text=${encodeURIComponent(\n    text\n  )}`;\n  const css = await (await fetch(url)).text();\n  const resource = css.match(/src: url\\((.+)\\) format\\('(opentype|truetype)'\\)/);\n\n  if (resource) {\n    const response = await fetch(resource[1]);\n    if (response.status == 200) {\n      return await response.arrayBuffer();\n    }\n  }\n\n  throw new Error('failed to load font data');\n}\n\nexport async function GET(request: Request) {\n  const url = new URL(request.url);\n  const title = url.searchParams.get('title') ?? 'React Native Reusables';\n  const description = url.searchParams.get('description') ?? 'Bringing shadcn/ui to React Native';\n\n  return new ImageResponse(\n    (\n      <div tw=\"w-full h-full bg-white flex flex-col\">\n        <div tw=\"flex flex-col w-full h-full items-center justify-center bg-white \">\n          {/*  */}\n          <div tw=\"absolute left-20 h-full w-px bg-[#E4E4E7]\" />\n          <div tw=\"absolute right-20 h-full w-px bg-[#E4E4E7]\" />\n          <div tw=\"absolute top-[61px] h-px w-full bg-[#E4E4E7]\" />\n          <div tw=\"absolute bottom-[61px] h-px w-full bg-[#E4E4E7]\" />\n          {/*  */}\n          <div tw=\"absolute left-[79px] top-[38px] h-12 w-[3px] bg-[#B7B7C4]\"></div>\n          <div tw=\"absolute top-[60px] left-14 h-[3px] w-12 bg-[#B7B7C4]\"></div>\n          <div tw=\"absolute right-[79px] bottom-[38px] h-12 w-[3px] bg-[#B7B7C4]\"></div>\n          <div tw=\"absolute bottom-[60px] right-14 h-[3px] w-12 bg-[#B7B7C4]\"></div>\n\n          <div tw=\"flex-1 flex items-center justify-center p-12 overflow-hidden\">\n            <img\n              src=\"https://exqr2q84pq.ufs.sh/f/r8NDF0EyEd5ox95GIV1BVwTqQuzWyE0Sj7IHZOJ9vs6tkc1G\"\n              height={504}\n              width={1040}\n              style={{\n                opacity: 0.5,\n                filter: 'contrast(10%)',\n                objectFit: 'cover',\n              }}\n            />\n            <span tw=\"absolute bottom-24 left-0 right-0 flex items-center justify-center\">\n              <svg\n                width=\"44\"\n                height=\"39\"\n                viewBox=\"0 0 100 89\"\n                fill=\"none\"\n                xmlns=\"http://www.w3.org/2000/svg\">\n                <path\n                  d=\"M61.3902 44.3533L50.0005 55.6349M59.1123 31.9434L37.4717 53.3786M50.0005 65.869C76.5099 65.869 98 56.302 98 44.5002C98 32.6983 76.5099 23.1313 50.0005 23.1313C23.491 23.1313 2 32.6983 2 44.5002C2 56.302 23.491 65.869 50.0005 65.869ZM31.294 55.1846C44.5492 77.897 63.6687 91.525 73.9998 85.6245C84.3317 79.7231 81.9612 56.5273 68.706 33.8158C55.4517 11.1025 36.3313 -2.52551 26.0011 3.37585C15.6692 9.27632 18.0398 32.4722 31.294 55.1846ZM31.294 33.8158C18.0398 56.5282 15.6701 79.7231 26.0002 85.6245C36.3322 91.525 55.4517 77.8961 68.706 55.1846C81.9611 32.4713 84.3317 9.27721 74.0007 3.37585C63.6687 -2.52551 44.5492 11.1034 31.294 33.8158Z\"\n                  stroke=\"#0A0A0A\"\n                  strokeWidth=\"4\"\n                  strokeLinecap=\"round\"\n                />\n              </svg>\n            </span>\n            <span tw=\"absolute block top-12 right-12 left-12 bottom-12 flex flex-col items-center justify-center\">\n              <h1\n                tw=\"text-7xl tracking-tight text-center mt-5 mb-0.5\"\n                style={{\n                  textWrap: title?.split(' ').length > 1 ? 'balance' : 'initial',\n                }}>\n                {title}\n              </h1>\n              <p tw=\"text-2xl text-center max-w-[800px] text-neutral-600 pb-2\">{description}</p>\n            </span>\n          </div>\n        </div>\n      </div>\n    ),\n    {\n      width: 1200,\n      height: 628,\n      fonts: [\n        {\n          name: 'Geist',\n          data: await loadGoogleFont('700', title ?? ''),\n          style: 'normal',\n          weight: 700,\n        },\n        {\n          name: 'Geist',\n          data: await loadGoogleFont('500', description ?? ''),\n          style: 'normal',\n          weight: 500,\n        },\n      ],\n    }\n  );\n}\n"
  },
  {
    "path": "apps/docs/app/showcase/links/[[...slug]]/page.tsx",
    "content": "import { DownloadAppBanner } from '@docs/components/download-app-banner';\n\nexport default async function Page() {\n  return (\n    <main className=\"flex min-h-svh items-center justify-center p-2\">\n      <DownloadAppBanner\n        size=\"sm\"\n        title=\"Download the App\"\n        description=\"This content is available only through the React Native Reusables app.\"\n      />\n    </main>\n  );\n}\n"
  },
  {
    "path": "apps/docs/app/showcase/privacy-policy/page.tsx",
    "content": "export default function Page() {\n  return (\n    <div className=\"prose mx-auto max-w-3xl px-4 py-24\">\n      <h1>Privacy Policy</h1>\n      <p>Effective Date: July 19, 2025</p>\n\n      <p>\n        The React Native Reusables App (“the App”) is an interactive developer tool that allows\n        users to explore, preview, and interact with a wide range of UI components and blocks\n        provided by the React Native Reusables project. It is designed for developers and designers\n        who want to evaluate, learn from, and integrate these components into their own\n        applications.\n      </p>\n\n      <h2>1. Information We Collect</h2>\n      <p>\n        We do not collect, store, or share any personal data. At this time, the App does not require\n        authentication and does not track user behavior, usage statistics, or analytics data.\n      </p>\n\n      <h2>2. Authentication</h2>\n      <p>\n        No authentication mechanisms are currently implemented. If authentication is added in the\n        future, this Privacy Policy will be updated to reflect that change.\n      </p>\n\n      <h2>3. Data Usage and Sharing</h2>\n      <p>Since we do not collect any data, we do not share any data with third parties.</p>\n\n      <h2>4. Changes to This Policy</h2>\n      <p>\n        We may update this Privacy Policy if features change. If we do, we will revise the\n        “Effective Date” at the top of this page. For any significant changes, we may provide\n        additional notice within the app.\n      </p>\n\n      <h2>5. Contact</h2>\n      <p>\n        If you have any questions about this Privacy Policy or the App, please contact us at:\n        hello@foundedlabs.com\n      </p>\n    </div>\n  );\n}\n"
  },
  {
    "path": "apps/docs/app/showcase/support/page.tsx",
    "content": "export default function Page() {\n  return (\n    <div className=\"prose mx-auto max-w-3xl px-4 py-24\">\n      <h1>Support</h1>\n      <p>Effective Date: July 26, 2025</p>\n      <p>\n        The React Native Reusables App (“the App”) is an interactive developer tool that enables\n        users to explore and implement UI components and blocks provided by the React Native\n        Reusables project.\n      </p>\n      <h2>1. How to Get Support</h2>\n      <p>If you need help with the App or React Native Reusables, you can:</p>\n      <ul>\n        <li>\n          Browse the documentation available on this{' '}\n          <a href=\"https://reactnativereusables.com/docs\">website</a>.\n        </li>\n        <li>\n          Open a discussion or report an issue on the{' '}\n          <a href=\"https://github.com/founded-labs/react-native-reusables\" target=\"_blank\">\n            GitHub repository\n          </a>\n          .\n        </li>\n        <li>Reach out directly by email at: hello@foundedlabs.com</li>\n      </ul>\n      <h2>2. Response Time</h2>\n      <p>\n        Support inquiries will be reviewed as time permits. While there is no guaranteed response\n        time, every effort will be made to address questions and issues promptly.\n      </p>\n      <h2>3. Updates to Support Information</h2>\n      <p>\n        Support details may be updated in the future. When changes occur, they will be reflected on\n        this page.\n      </p>\n      <h2>4. Contact</h2>\n      <p>\n        For any additional assistance, contact: <br />\n        hello@foundedlabs.com\n      </p>\n    </div>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components/app-store-button.tsx",
    "content": "export function AppStoreButton() {\n  return (\n    <a\n      target=\"_blank\"\n      href=\"https://apps.apple.com/ca/app/react-native-reusables/id6748838250\"\n      className=\"rounded-md\">\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        id=\"livetype\"\n        viewBox=\"0 0 119.66407 40\"\n        className=\"h-10 sm:h-12\">\n        <title>Download_on_the_App_Store_Badge_US-UK_RGB_wht_092917</title>\n        <g>\n          <g>\n            <g>\n              <path d=\"M110.13477,0H9.53468c-.3667,0-.729,0-1.09473.002-.30615.002-.60986.00781-.91895.0127A13.21476,13.21476,0,0,0,5.5171.19141a6.66509,6.66509,0,0,0-1.90088.627A6.43779,6.43779,0,0,0,1.99757,1.99707,6.25844,6.25844,0,0,0,.81935,3.61816a6.60119,6.60119,0,0,0-.625,1.90332,12.993,12.993,0,0,0-.1792,2.002C.00587,7.83008.00489,8.1377,0,8.44434V31.5586c.00489.3105.00587.6113.01515.9219a12.99232,12.99232,0,0,0,.1792,2.0019,6.58756,6.58756,0,0,0,.625,1.9043A6.20778,6.20778,0,0,0,1.99757,38.001a6.27445,6.27445,0,0,0,1.61865,1.1787,6.70082,6.70082,0,0,0,1.90088.6308,13.45514,13.45514,0,0,0,2.0039.1768c.30909.0068.6128.0107.91895.0107C8.80567,40,9.168,40,9.53468,40H110.13477c.3594,0,.7246,0,1.084-.002.3047,0,.6172-.0039.9219-.0107a13.279,13.279,0,0,0,2-.1768,6.80432,6.80432,0,0,0,1.9082-.6308,6.27742,6.27742,0,0,0,1.6172-1.1787,6.39482,6.39482,0,0,0,1.1816-1.6143,6.60413,6.60413,0,0,0,.6191-1.9043,13.50643,13.50643,0,0,0,.1856-2.0019c.0039-.3106.0039-.6114.0039-.9219.0078-.3633.0078-.7246.0078-1.0938V9.53613c0-.36621,0-.72949-.0078-1.09179,0-.30664,0-.61426-.0039-.9209a13.5071,13.5071,0,0,0-.1856-2.002,6.6177,6.6177,0,0,0-.6191-1.90332,6.46619,6.46619,0,0,0-2.7988-2.7998,6.76754,6.76754,0,0,0-1.9082-.627,13.04394,13.04394,0,0,0-2-.17676c-.3047-.00488-.6172-.01074-.9219-.01269-.3594-.002-.7246-.002-1.084-.002Z\" />\n              <path\n                d=\"M8.44483,39.125c-.30468,0-.602-.0039-.90429-.0107a12.68714,12.68714,0,0,1-1.86914-.1631,5.88381,5.88381,0,0,1-1.65674-.5479,5.40573,5.40573,0,0,1-1.397-1.0166,5.32082,5.32082,0,0,1-1.02051-1.3965,5.72186,5.72186,0,0,1-.543-1.6572,12.41351,12.41351,0,0,1-.1665-1.875c-.00634-.2109-.01464-.9131-.01464-.9131V8.44434S.88185,7.75293.8877,7.5498a12.37039,12.37039,0,0,1,.16553-1.87207,5.7555,5.7555,0,0,1,.54346-1.6621A5.37349,5.37349,0,0,1,2.61183,2.61768,5.56543,5.56543,0,0,1,4.01417,1.59521a5.82309,5.82309,0,0,1,1.65332-.54394A12.58589,12.58589,0,0,1,7.543.88721L8.44532.875H111.21387l.9131.0127a12.38493,12.38493,0,0,1,1.8584.16259,5.93833,5.93833,0,0,1,1.6709.54785,5.59374,5.59374,0,0,1,2.415,2.41993,5.76267,5.76267,0,0,1,.5352,1.64892,12.995,12.995,0,0,1,.1738,1.88721c.0029.2832.0029.5874.0029.89014.0079.375.0079.73193.0079,1.09179V30.4648c0,.3633,0,.7178-.0079,1.0752,0,.3252,0,.6231-.0039.9297a12.73126,12.73126,0,0,1-.1709,1.8535,5.739,5.739,0,0,1-.54,1.67,5.48029,5.48029,0,0,1-1.0156,1.3857,5.4129,5.4129,0,0,1-1.3994,1.0225,5.86168,5.86168,0,0,1-1.668.5498,12.54218,12.54218,0,0,1-1.8692.1631c-.2929.0068-.5996.0107-.8974.0107l-1.084.002Z\"\n                className=\"fill-black dark:fill-white\"\n              />\n            </g>\n            <g id=\"_Group_\" data-name=\"&lt;Group&gt;\" className=\"fill-white dark:fill-black\">\n              <g id=\"_Group_2\" data-name=\"&lt;Group&gt;\">\n                <g id=\"_Group_3\" data-name=\"&lt;Group&gt;\">\n                  <path\n                    id=\"_Path_\"\n                    data-name=\"&lt;Path&gt;\"\n                    d=\"M24.99671,19.88935a5.14625,5.14625,0,0,1,2.45058-4.31771,5.26776,5.26776,0,0,0-4.15039-2.24376c-1.74624-.1833-3.43913,1.04492-4.329,1.04492-.90707,0-2.27713-1.02672-3.75247-.99637a5.52735,5.52735,0,0,0-4.65137,2.8367c-2.01111,3.482-.511,8.59939,1.41551,11.414.96388,1.37823,2.09037,2.91774,3.56438,2.86315,1.4424-.05983,1.98111-.91977,3.7222-.91977,1.72494,0,2.23035.91977,3.73427.88506,1.54777-.02512,2.52292-1.38435,3.453-2.77563a11.39931,11.39931,0,0,0,1.579-3.21589A4.97284,4.97284,0,0,1,24.99671,19.88935Z\"\n                  />\n                  <path\n                    id=\"_Path_2\"\n                    data-name=\"&lt;Path&gt;\"\n                    d=\"M22.15611,11.47681a5.06687,5.06687,0,0,0,1.159-3.62989,5.15524,5.15524,0,0,0-3.33555,1.72582,4.82131,4.82131,0,0,0-1.18934,3.4955A4.26259,4.26259,0,0,0,22.15611,11.47681Z\"\n                  />\n                </g>\n              </g>\n              <g>\n                <path d=\"M42.30178,27.13965h-4.7334l-1.13672,3.35645H34.42678l4.4834-12.418h2.083l4.4834,12.418H43.43752Zm-4.24316-1.54883h3.752L39.961,20.14355H39.9092Z\" />\n                <path d=\"M55.1592,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238h1.79883v1.50586h.03418a3.21162,3.21162,0,0,1,2.88281-1.60059C53.64455,21.34766,55.1592,23.16406,55.1592,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C52.30178,29.01563,53.249,27.81934,53.249,25.96973Z\" />\n                <path d=\"M65.12453,25.96973c0,2.81348-1.50635,4.62109-3.77881,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238h1.79883v1.50586h.03418a3.21162,3.21162,0,0,1,2.88281-1.60059C63.6094,21.34766,65.12453,23.16406,65.12453,25.96973Zm-1.91064,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C62.26662,29.01563,63.21389,27.81934,63.21389,25.96973Z\" />\n                <path d=\"M71.70949,27.03613c.1377,1.23145,1.334,2.04,2.96875,2.04,1.56641,0,2.69336-.80859,2.69336-1.91895,0-.96387-.67969-1.541-2.28906-1.93652l-1.60937-.3877c-2.28027-.55078-3.33887-1.61719-3.33887-3.34766,0-2.14258,1.86719-3.61426,4.51758-3.61426,2.625,0,4.42383,1.47168,4.48438,3.61426h-1.876c-.1123-1.23926-1.13672-1.9873-2.63379-1.9873s-2.52148.75684-2.52148,1.8584c0,.87793.6543,1.39453,2.25488,1.79l1.36816.33594c2.54785.60254,3.60547,1.626,3.60547,3.44238,0,2.32324-1.84961,3.77832-4.793,3.77832-2.75391,0-4.61328-1.4209-4.7334-3.667Z\" />\n                <path d=\"M83.34621,19.2998v2.14258h1.72168v1.47168H83.34621v4.99121c0,.77539.34473,1.13672,1.10156,1.13672a5.80752,5.80752,0,0,0,.61133-.043v1.46289a5.10351,5.10351,0,0,1-1.03223.08594c-1.833,0-2.54785-.68848-2.54785-2.44434V22.91406H80.16262V21.44238H81.479V19.2998Z\" />\n                <path d=\"M86.064,25.96973c0-2.84863,1.67773-4.63867,4.29395-4.63867,2.625,0,4.29492,1.79,4.29492,4.63867,0,2.85645-1.66113,4.63867-4.29492,4.63867C87.72512,30.6084,86.064,28.82617,86.064,25.96973Zm6.69531,0c0-1.9541-.89551-3.10742-2.40137-3.10742s-2.40137,1.16211-2.40137,3.10742c0,1.96191.89551,3.10645,2.40137,3.10645S92.7593,27.93164,92.7593,25.96973Z\" />\n                <path d=\"M96.18508,21.44238h1.77246v1.541h.043a2.1594,2.1594,0,0,1,2.17773-1.63574,2.86616,2.86616,0,0,1,.63672.06934v1.73828a2.59794,2.59794,0,0,0-.835-.1123,1.87264,1.87264,0,0,0-1.93652,2.083v5.37012h-1.8584Z\" />\n                <path d=\"M109.38332,27.83691c-.25,1.64355-1.85059,2.77148-3.89844,2.77148-2.63379,0-4.26855-1.76465-4.26855-4.5957,0-2.83984,1.64355-4.68164,4.19043-4.68164,2.50488,0,4.08008,1.7207,4.08008,4.46582v.63672h-6.39453v.1123a2.358,2.358,0,0,0,2.43555,2.56445,2.04834,2.04834,0,0,0,2.09082-1.27344Zm-6.28223-2.70215h4.52637a2.1773,2.1773,0,0,0-2.2207-2.29785A2.292,2.292,0,0,0,103.10109,25.13477Z\" />\n              </g>\n            </g>\n          </g>\n          <g id=\"_Group_4\" data-name=\"&lt;Group&gt;\" className=\"fill-white dark:fill-black\">\n            <g>\n              <path d=\"M37.82619,8.731a2.63964,2.63964,0,0,1,2.80762,2.96484c0,1.90625-1.03027,3.002-2.80762,3.002H35.67092V8.731Zm-1.22852,5.123h1.125a1.87588,1.87588,0,0,0,1.96777-2.146,1.881,1.881,0,0,0-1.96777-2.13379h-1.125Z\" />\n              <path d=\"M41.68068,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C44.57522,13.99463,45.01369,13.42432,45.01369,12.44434Z\" />\n              <path d=\"M51.57326,14.69775h-.92187l-.93066-3.31641h-.07031l-.92676,3.31641h-.91309l-1.24121-4.50293h.90137l.80664,3.436h.06641l.92578-3.436h.85254l.92578,3.436h.07031l.80273-3.436h.88867Z\" />\n              <path d=\"M53.85354,10.19482H54.709v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915h-.88867V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z\" />\n              <path d=\"M59.09377,8.437h.88867v6.26074h-.88867Z\" />\n              <path d=\"M61.21779,12.44434a2.13346,2.13346,0,1,1,4.24756,0,2.1338,2.1338,0,1,1-4.24756,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C64.11232,13.99463,64.5508,13.42432,64.5508,12.44434Z\" />\n              <path d=\"M66.4009,13.42432c0-.81055.60352-1.27783,1.6748-1.34424l1.21973-.07031v-.38867c0-.47559-.31445-.74414-.92187-.74414-.49609,0-.83984.18213-.93848.50049h-.86035c.09082-.77344.81836-1.26953,1.83984-1.26953,1.12891,0,1.76563.562,1.76563,1.51318v3.07666h-.85547v-.63281h-.07031a1.515,1.515,0,0,1-1.35254.707A1.36026,1.36026,0,0,1,66.4009,13.42432Zm2.89453-.38477v-.37646l-1.09961.07031c-.62012.0415-.90137.25244-.90137.64941,0,.40527.35156.64111.835.64111A1.0615,1.0615,0,0,0,69.29543,13.03955Z\" />\n              <path d=\"M71.34816,12.44434c0-1.42285.73145-2.32422,1.86914-2.32422a1.484,1.484,0,0,1,1.38086.79h.06641V8.437h.88867v6.26074h-.85156v-.71143h-.07031a1.56284,1.56284,0,0,1-1.41406.78564C72.0718,14.772,71.34816,13.87061,71.34816,12.44434Zm.918,0c0,.95508.4502,1.52979,1.20313,1.52979.749,0,1.21191-.583,1.21191-1.52588,0-.93848-.46777-1.52979-1.21191-1.52979C72.72121,10.91846,72.26613,11.49707,72.26613,12.44434Z\" />\n              <path d=\"M79.23,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C82.12453,13.99463,82.563,13.42432,82.563,12.44434Z\" />\n              <path d=\"M84.66945,10.19482h.85547v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915H87.605V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z\" />\n              <path d=\"M93.51516,9.07373v1.1416h.97559v.74854h-.97559V13.2793c0,.47168.19434.67822.63672.67822a2.96657,2.96657,0,0,0,.33887-.02051v.74023a2.9155,2.9155,0,0,1-.4834.04541c-.98828,0-1.38184-.34766-1.38184-1.21582v-2.543h-.71484v-.74854h.71484V9.07373Z\" />\n              <path d=\"M95.70461,8.437h.88086v2.48145h.07031a1.3856,1.3856,0,0,1,1.373-.80664,1.48339,1.48339,0,0,1,1.55078,1.67871v2.90723H98.69v-2.688c0-.71924-.335-1.0835-.96289-1.0835a1.05194,1.05194,0,0,0-1.13379,1.1416v2.62988h-.88867Z\" />\n              <path d=\"M104.76125,13.48193a1.828,1.828,0,0,1-1.95117,1.30273A2.04531,2.04531,0,0,1,100.73,12.46045a2.07685,2.07685,0,0,1,2.07617-2.35254c1.25293,0,2.00879.856,2.00879,2.27V12.688h-3.17969v.0498a1.1902,1.1902,0,0,0,1.19922,1.29,1.07934,1.07934,0,0,0,1.07129-.5459Zm-3.126-1.45117h2.27441a1.08647,1.08647,0,0,0-1.1084-1.1665A1.15162,1.15162,0,0,0,101.63527,12.03076Z\" />\n            </g>\n          </g>\n        </g>\n      </svg>\n    </a>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components/auth-block-tabs.tsx",
    "content": "'use client';\n\nimport {\n  AuthIntegrationSelect,\n  useAuthIntegration,\n} from '@docs/components/auth-integration-select';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@docs/components/ui/tabs';\nimport * as React from 'react';\n\nexport function AuthBlockTabs({ children }: React.PropsWithChildren) {\n  return (\n    <Tabs defaultValue=\"cli\">\n      <div className=\"flex items-center justify-between\">\n        <TabsList>\n          <TabsTrigger id=\"cli\" value=\"cli\">\n            CLI\n          </TabsTrigger>\n          <TabsTrigger id=\"manual\" value=\"manual\">\n            Manual\n          </TabsTrigger>\n        </TabsList>\n        <AuthIntegrationSelect className=\"mt-px\" />\n      </div>\n      {children}\n    </Tabs>\n  );\n}\ntype AuthIntegration = 'none' | 'clerk';\n\ntype ContentProps = {\n  integration: AuthIntegration;\n  children: React.ReactNode;\n};\n\nexport function AuthBlockTabsCliContent({ children, integration: integrationProp }: ContentProps) {\n  const [integration] = useAuthIntegration();\n\n  if (integration !== integrationProp) {\n    return null;\n  }\n  return <TabsContent value=\"cli\">{children}</TabsContent>;\n}\n\nexport function AuthBlockTabsManualContent({\n  children,\n  integration: integrationProp,\n}: ContentProps) {\n  const [integration] = useAuthIntegration();\n\n  if (integration !== integrationProp) {\n    return null;\n  }\n\n  return <TabsContent value=\"manual\">{children}</TabsContent>;\n}\n"
  },
  {
    "path": "apps/docs/components/auth-integration-select.tsx",
    "content": "'use client';\n\nimport type { SelectProps } from '@radix-ui/react-select';\nimport * as React from 'react';\nimport {\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n} from '@docs/components/ui/select';\nimport { useReactiveGetCookie, useReactiveSetCookie } from 'cookies-next/client';\nimport { Button } from '@docs/components/ui/button';\n\nconst INTEGRATIONS = [\n  { name: 'none', label: 'None' },\n  { name: 'clerk', label: 'Clerk' },\n] as const;\n\ntype Integration = (typeof INTEGRATIONS)[number]['name'];\n\nexport function AuthIntegrationSelect({\n  className,\n  ...props\n}: SelectProps & { className?: string }) {\n  const [isClient, setIsClient] = React.useState(false);\n  const [integration, onIntegrationChange] = useAuthIntegration();\n\n  React.useEffect(() => {\n    setIsClient(true);\n  }, []);\n\n  return (\n    <Select {...props} defaultValue=\"none\" value={integration} onValueChange={onIntegrationChange}>\n      <Button asChild variant=\"outline\" size=\"sm\" className={className}>\n        <SelectTrigger className=\"dark:bg-muted dark:hover:bg-muted/80 dark:border-muted-foreground/15 w-fit\">\n          <span className=\"text-muted-foreground flex-1 pr-1\">Integration:</span>\n          {!isClient ? (\n            <span className=\"opacity-50\">\n              {\n                INTEGRATIONS.find((integration) =>\n                  integration.name === props.value ? props.value : props.defaultValue\n                )?.label\n              }\n            </span>\n          ) : (\n            <SelectValue placeholder=\"Select integration\" />\n          )}\n        </SelectTrigger>\n      </Button>\n      <SelectContent onCloseAutoFocus={preventDefault} className=\"dark:bg-neutral-900\">\n        {INTEGRATIONS.map((integration) => (\n          <SelectItem key={integration.name} value={integration.name} className=\"text-xs\">\n            {integration.label}\n          </SelectItem>\n        ))}\n      </SelectContent>\n    </Select>\n  );\n}\n\nexport function useAuthIntegration() {\n  const getCookie = useReactiveGetCookie();\n  const setCookie = useReactiveSetCookie();\n  const integration = getCookie('user.auth-integration') ?? 'none';\n  function onIntegrationChange(value: Integration) {\n    setCookie('user.auth-integration', value);\n  }\n\n  return [integration, onIntegrationChange] as const;\n}\n\nfunction preventDefault(e: Event) {\n  e.preventDefault();\n}\n"
  },
  {
    "path": "apps/docs/components/blocks-grid.tsx",
    "content": "import { Button } from '@docs/components/ui/button';\nimport Link from 'next/link';\n\nconst BLOCKS = [\n  { title: 'Sign in form', href: '/docs/blocks/authentication/sign-in-form' },\n  { title: 'Sign up form', href: '/docs/blocks/authentication/sign-up-form' },\n  { title: 'Verify email form', href: '/docs/blocks/authentication/verify-email-form' },\n  { title: 'Reset password form', href: '/docs/blocks/authentication/reset-password-form' },\n  { title: 'Forgot password form', href: '/docs/blocks/authentication/forgot-password-form' },\n  { title: 'Social connections', href: '/docs/blocks/authentication/social-connections' },\n  { title: 'User menu', href: '/docs/blocks/authentication/user-menu' },\n];\n\nexport function BlocksGrid() {\n  return (\n    <div className=\"not-prose sm:gird-cols-3 grid grid-cols-2 gap-4 xl:grid-cols-4\">\n      {BLOCKS.map((block) => (\n        <Button\n          asChild\n          size=\"lg\"\n          variant=\"link\"\n          key={block.href}\n          className=\"justify-start px-0 text-base font-normal\">\n          <Link href={block.href}>{block.title}</Link>\n        </Button>\n      ))}\n    </div>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components/blocks.tsx",
    "content": "'use client';\n\nexport * from '@/registry/blocks';\n"
  },
  {
    "path": "apps/docs/components/callout.tsx",
    "content": "import { CircleCheckIcon, CircleXIcon, InfoIcon, TriangleAlertIcon } from 'lucide-react';\nimport { cn } from '@docs/lib/utils';\n\nconst ICONS = {\n  info: InfoIcon,\n  warning: TriangleAlertIcon,\n  error: CircleXIcon,\n  success: CircleCheckIcon,\n};\n\ntype CalloutProps = Omit<React.ComponentProps<'div'>, 'title' | 'type' | 'icon'> & {\n  title?: React.ReactNode;\n  /**\n   * @defaultValue info\n   */\n  type?: 'info' | 'warn' | 'error' | 'success' | 'warning';\n};\n\nexport function Callout({ className, children, title, type, ...props }: CalloutProps) {\n  if (type === 'warn') {\n    type = 'warning';\n  }\n\n  const Icon = type ? ICONS[type] : null;\n\n  return (\n    <div\n      className={cn(\n        'bg-fd-card text-fd-card-foreground my-4 flex gap-2 rounded-xl border p-3 ps-1 text-sm shadow-sm',\n        className\n      )}\n      {...props}>\n      <div role=\"none\" className={!type ? 'w-1' : 'w-0.5'} />\n      {Icon && <Icon className=\"mt-0.5 size-4\" />}\n      <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n        {title && <p className=\"!my-0 font-medium\">{title}</p>}\n        <div className=\"text-fd-muted-foreground prose-no-margin empty:hidden\">{children}</div>\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components/clerk-logo.tsx",
    "content": "import { cn } from '@docs/lib/utils';\n\nexport function ClerkLogo({ className, ...props }: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg\n      viewBox=\"0 0 441 128\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className={cn('fill-fd-foreground h-6', className)}\n      {...props}>\n      <path d=\"M166.971 40.9172C178.576 40.9172 190.795 45.5232 198.363 54.4358C198.413 54.4943 198.406 54.5818 198.348 54.6321L186.955 64.4905C186.897 64.5411 186.808 64.5348 186.757 64.4768C184.442 61.8452 181.568 59.7383 178.335 58.303C175.059 56.8492 171.495 56.1207 167.898 56.1702C154.488 56.1702 145.548 65.3619 145.548 78.8C145.548 85.5131 147.771 91.145 151.635 95.0891C153.762 97.1729 156.302 98.8083 159.099 99.8948C161.896 100.981 164.891 101.496 167.898 101.406C171.46 101.438 174.992 100.759 178.276 99.4104C181.52 98.0791 184.457 96.1229 186.911 93.6584C186.963 93.6061 187.047 93.6025 187.103 93.6506L198.748 103.698C198.808 103.749 198.814 103.839 198.761 103.898C192.264 111.073 180.762 116.764 166.364 116.764C155.225 116.764 145.571 112.854 138.795 106.199C132.019 99.5445 128 90.1203 128 78.928C128 56.2988 144.169 40.9174 166.971 40.9172ZM272.297 40.9241C294.364 40.9243 308.634 56.4443 308.634 77.8733C308.603 80.0994 308.45 82.3226 308.177 84.5325C308.168 84.6028 308.108 84.6555 308.037 84.6555H253.776C253.687 84.6555 253.62 84.7398 253.64 84.8274C255.961 95.114 263.91 101.384 274.9 101.384C278.479 101.459 282.026 100.724 285.269 99.2327C288.467 97.7617 291.284 95.5949 293.505 92.8977C293.555 92.8373 293.644 92.829 293.704 92.8792L294.151 93.2522L305.314 102.971C305.371 103.02 305.379 103.107 305.332 103.165C299.016 110.999 288.524 116.764 273.977 116.764C252.205 116.764 235.781 101.687 235.781 78.7805C235.781 67.5426 239.651 58.1184 246.1 51.4641C249.503 48.0425 253.584 45.3422 258.089 43.5295C262.594 41.7168 267.43 40.83 272.297 40.9241ZM225.661 11.9758C225.739 11.9758 225.802 12.0388 225.802 12.1165V115.625C225.802 115.703 225.739 115.766 225.661 115.766H208.977C208.899 115.766 208.836 115.703 208.836 115.625V12.1165C208.836 12.0389 208.899 11.976 208.977 11.9758H225.661ZM361.385 40.9192C361.463 40.9183 361.527 40.9816 361.527 41.0598V59.6116C361.527 59.6933 361.457 59.7582 361.376 59.7522C359.432 59.6052 357.496 59.4612 356.304 59.4612C343.246 59.4613 335.579 68.6515 335.579 80.7151V115.625C335.579 115.703 335.516 115.766 335.438 115.766H318.755C318.677 115.766 318.614 115.703 318.614 115.625V42.1047C318.614 42.0272 318.677 41.9641 318.755 41.9641H335.438C335.516 41.9641 335.579 42.0272 335.579 42.1047V53.0413C335.579 53.098 335.626 53.1438 335.683 53.1438C335.715 53.1438 335.746 53.1287 335.766 53.1028C341.617 45.2882 350.254 40.9407 359.379 40.9407L361.385 40.9192ZM388.332 11.9758C388.41 11.9759 388.473 12.0388 388.473 12.1165V75.2815C388.473 75.4096 388.63 75.4707 388.717 75.3762L419.408 41.9211C419.435 41.8922 419.472 41.8752 419.512 41.8752H439.575C439.697 41.8752 439.762 42.0202 439.68 42.1106L412.928 71.6262C412.886 71.6727 412.879 71.7419 412.912 71.7952L440.031 115.551C440.089 115.645 440.022 115.766 439.912 115.766H420.879C420.83 115.766 420.784 115.741 420.759 115.699L401.525 84.7874C401.5 84.7463 401.455 84.7209 401.406 84.7209H401.226C401.187 84.7209 401.149 84.7373 401.122 84.7659L388.51 98.3167C388.486 98.3426 388.473 98.3769 388.473 98.4124V115.625C388.473 115.703 388.41 115.766 388.332 115.766H371.647C371.57 115.766 371.507 115.703 371.507 115.625V12.1165C371.507 12.0388 371.57 11.9759 371.647 11.9758H388.332ZM273.184 56.1526C270.429 56.0653 267.689 56.5639 265.148 57.6135C262.608 58.6639 260.328 60.2418 258.465 62.2375C256.265 64.7317 254.709 67.7085 253.927 70.9172C253.905 71.0052 253.972 71.09 254.062 71.0901H291.098C291.188 71.0901 291.255 71.0045 291.233 70.9163C289.077 62.1122 282.94 56.1526 273.184 56.1526Z\" />\n      <circle cx=\"64\" cy=\"64\" r=\"20\" />\n      <path\n        d=\"M99.5716 10.788C101.571 12.1272 101.742 14.9444 100.04 16.646L85.4244 31.2618C84.1035 32.5828 82.0542 32.7914 80.3915 31.9397C75.4752 29.421 69.9035 28 64 28C44.1177 28 28 44.1177 28 64C28 69.9035 29.421 75.4752 31.9397 80.3915C32.7914 82.0542 32.5828 84.1035 31.2618 85.4244L16.646 100.04C14.9444 101.742 12.1272 101.571 10.788 99.5716C3.97411 89.3989 0 77.1635 0 64C0 28.6538 28.6538 0 64 0C77.1635 0 89.3989 3.97411 99.5716 10.788Z\"\n        fillOpacity=\"0.4\"\n      />\n      <path d=\"M100.04 111.354C101.742 113.056 101.571 115.873 99.5717 117.212C89.3989 124.026 77.1636 128 64 128C50.8364 128 38.6011 124.026 28.4283 117.212C26.4289 115.873 26.2581 113.056 27.9597 111.354L42.5755 96.7382C43.8964 95.4172 45.9457 95.2085 47.6084 96.0603C52.5247 98.579 58.0964 100 64 100C69.9036 100 75.4753 98.579 80.3916 96.0603C82.0543 95.2085 84.1035 95.4172 85.4245 96.7382L100.04 111.354Z\" />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components/command-tabs.tsx",
    "content": "import { CodeBlock, Pre } from 'fumadocs-ui/components/codeblock';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\n\nconst MANAGERS = ['npm', 'bun', 'pnpm', 'yarn', 'yarn@berry'] as const;\n\nconst COMMAND: Record<(typeof MANAGERS)[number], string[]> = {\n  npm: ['npx'],\n  bun: ['bunx', '--bun'],\n  pnpm: ['pnpm', 'dlx'],\n  yarn: ['npx'],\n  'yarn@berry': ['yarn', 'dlx'],\n};\n\nexport function CommandTabs({ args }: { args: string[] }) {\n  return (\n    <div className=\"dark\">\n      <Tabs items={MANAGERS as unknown as string[]} groupId=\"manager\" persist>\n        {MANAGERS.map((manager) => (\n          <Tab key={manager} value={manager} className=\"dark:text-foreground *:dark\">\n            <CodeBlock>\n              <Pre>\n                <code>\n                  {[...COMMAND[manager], '@react-native-reusables/cli@latest', ...args].join(' ')}\n                </code>\n              </Pre>\n            </CodeBlock>\n          </Tab>\n        ))}\n      </Tabs>\n    </div>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components/cookies-provider.tsx",
    "content": "'use client';\n\nimport { CookiesNextProvider } from 'cookies-next';\n\nexport function CookiesProvider({ children }: { children: React.ReactNode }) {\n  return <CookiesNextProvider>{children}</CookiesNextProvider>;\n}\n"
  },
  {
    "path": "apps/docs/components/copy-button.tsx",
    "content": "'use client';\n\n// This project uses code from fumadocs.\n// The code is licensed under the MIT License.\n// https://github.com/fuma-nama/fumadocs\n\nimport { cn } from '@docs/lib/utils';\nimport { CheckIcon, CopyIcon } from 'lucide-react';\nimport * as React from 'react';\nimport { buttonVariants } from './ui/button';\n\nexport function CopyButton({\n  className,\n  content,\n  ...props\n}: React.ButtonHTMLAttributes<HTMLButtonElement> & {\n  content: string;\n}): React.ReactElement {\n  const onCopy = React.useCallback(() => {\n    void navigator.clipboard.writeText(content ?? '');\n  }, [content]);\n  const [checked, onClick] = useCopyButton(onCopy);\n\n  return (\n    <button\n      type=\"button\"\n      className={cn(\n        buttonVariants({\n          variant: 'ghost',\n          size: 'icon',\n        }),\n        'size-7 transition-opacity group-hover:opacity-100',\n        !checked && 'opacity-0',\n        className\n      )}\n      aria-label=\"Copy Text\"\n      onClick={onClick}\n      {...props}>\n      <CheckIcon className={cn('!size-3.5 transition-transform', !checked && 'scale-0')} />\n      <CopyIcon className={cn('absolute !size-3.5 transition-transform', checked && 'scale-0')} />\n    </button>\n  );\n}\n\nfunction useCopyButton(onCopy: () => void): [checked: boolean, onClick: React.MouseEventHandler] {\n  const [checked, setChecked] = React.useState(false);\n  const timeoutRef = React.useRef<number | null>(null);\n  const callbackRef = React.useRef(onCopy);\n  callbackRef.current = onCopy;\n\n  const onClick: React.MouseEventHandler = React.useCallback(() => {\n    if (timeoutRef.current) window.clearTimeout(timeoutRef.current);\n    timeoutRef.current = window.setTimeout(() => {\n      setChecked(false);\n    }, 1500);\n    callbackRef.current();\n    setChecked(true);\n  }, []);\n\n  // Avoid updates after being unmounted\n  React.useEffect(() => {\n    return () => {\n      if (timeoutRef.current) window.clearTimeout(timeoutRef.current);\n    };\n  }, []);\n\n  return [checked, onClick];\n}\n"
  },
  {
    "path": "apps/docs/components/download-app-banner.tsx",
    "content": "import { AppStoreButton } from './app-store-button';\nimport { PlayStoreButton } from './play-store-button';\nimport { RnrIcon } from './icons/rnr-icon';\nimport { cn } from '@docs/lib/utils';\n\nexport function DownloadAppBanner({\n  title = 'React Native Reusables',\n  description = 'Preview components on your phone by scanning QR codes from the docs.',\n  size = 'default',\n}: {\n  title?: string;\n  description?: string;\n  size?: 'default' | 'sm';\n}) {\n  return (\n    <div className=\"bg-card not-prose flex flex-col-reverse items-center justify-between gap-6 rounded-xl border p-12 shadow-sm sm:gap-8 lg:flex-row lg:p-14\">\n      <div\n        className={cn(\n          'flex max-w-[25.5rem] flex-col items-center justify-center gap-8 lg:items-start',\n          size === 'sm' && 'max-w-xs'\n        )}>\n        <div>\n          <h1 className=\"pb-1 text-center text-3xl font-medium lg:text-left lg:text-4xl\">\n            {title}\n          </h1>\n          <p className=\"text-muted-foreground text-center text-base lg:text-left\">{description}</p>\n        </div>\n        <div className=\"flex gap-2 lg:gap-3\">\n          <AppStoreButton />\n          <PlayStoreButton />\n        </div>\n      </div>\n      <div className=\"flex items-center justify-center\">\n        <div className=\"border-border/0 dark:border-border flex items-center justify-center rounded-3xl border bg-black p-4 shadow-md md:rounded-[2.5rem] md:p-6\">\n          <RnrIcon className=\"size-16 text-white md:size-32\" pathClassName=\"stroke-1\" />\n        </div>\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components/examples.tsx",
    "content": "'use client';\n\nexport * from '@/registry/examples';\n"
  },
  {
    "path": "apps/docs/components/external-links.tsx",
    "content": "import { ExternalLinkIcon } from 'lucide-react';\n\ntype ExternalLinksProps = {\n  links: {\n    title: string;\n    url: string;\n  }[];\n};\n\nexport function ExternalLinks(props: ExternalLinksProps) {\n  return (\n    <div className=\"flex flex-wrap gap-2 pb-5\">\n      {props.links.map((link) => (\n        <a\n          key={link.title}\n          href={link.url}\n          target=\"_blank\"\n          className=\"bg-muted hover:bg-muted/50 inline-flex rounded-md border px-2 py-0.5 no-underline\">\n          <div className=\"text-foreground/80 flex items-center gap-1 text-xs font-medium\">\n            {link.title} <ExternalLinkIcon strokeWidth={2.5} className=\"h-3 w-3\" />\n          </div>\n        </a>\n      ))}\n    </div>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components/icons/rnr-icon.tsx",
    "content": "import { cn } from '@docs/lib/utils';\n\nexport function RnrIcon({\n  className,\n  pathClassName,\n  ...props\n}: {\n  className?: string;\n  pathClassName?: string;\n}) {\n  return (\n    <svg\n      viewBox=\"0 0 26 23\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className={cn('w-5', className)}\n      shapeRendering=\"geometricPrecision\"\n      {...props}>\n      <path\n        d=\"M15.2858 11.4777L13.0001 13.7131M14.8287 9.01884L10.4858 13.266M13.0001 16.7794C19.6275 16.7794 25 14.4158 25 11.5C25 8.5843 19.6275 6.22068 13.0001 6.22068C6.37276 6.22068 1 8.5843 1 11.5C1 14.4158 6.37276 16.7794 13.0001 16.7794ZM8.3235 14.1397C11.6373 19.751 16.4172 23.1179 18.9999 21.6602C21.5829 20.2022 20.9903 14.4714 17.6765 8.86036C14.3629 3.24884 9.58282 -0.118067 7.00028 1.33992C4.41729 2.79768 5.00994 8.52842 8.3235 14.1397ZM8.3235 8.86036C5.00994 14.4717 4.41751 20.2022 7.00006 21.6602C9.58305 23.1179 14.3629 19.7508 17.6765 14.1397C20.9903 8.52821 21.5829 2.7979 19.0002 1.33992C16.4172 -0.118067 11.6373 3.24907 8.3235 8.86036Z\"\n        stroke=\"currentColor\"\n        strokeLinecap=\"round\"\n        className={cn('stroke-[1.2px]', pathClassName)}\n      />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components/installation-tabs.tsx",
    "content": "'use client';\n\nimport {\n  LinkTabs,\n  LinkTabsList,\n  LinkTabsTrigger,\n  LinkTabsContent,\n} from '@docs/components/link-tabs';\nimport * as React from 'react';\n\nfunction InstallationTabs({\n  value,\n  children,\n}: {\n  value: 'cli' | 'manual';\n  children: React.ReactNode;\n}) {\n  return (\n    <LinkTabs\n      ref={onRef(value)}\n      value={value === 'cli' ? '/docs/installation' : '/docs/installation/manual'}>\n      <LinkTabsList>\n        <LinkTabsTrigger href=\"/docs/installation\">CLI</LinkTabsTrigger>\n        <LinkTabsTrigger href=\"/docs/installation/manual\">Manual</LinkTabsTrigger>\n      </LinkTabsList>\n      <LinkTabsContent value={value === 'cli' ? '/docs/installation' : '/docs/installation/manual'}>\n        {children}\n      </LinkTabsContent>\n    </LinkTabs>\n  );\n}\n\nfunction onRef(value: 'cli' | 'manual') {\n  return () => {\n    if (value === 'cli') {\n      return;\n    }\n    const link = document.querySelector(\n      'a[data-active=\"false\"][href=\"/docs/installation\"]'\n    ) as HTMLAnchorElement | null;\n    if (!link) {\n      return;\n    }\n    link.classList.add('!bg-primary/10');\n    link.classList.add('!text-primary');\n    link.classList.add('!font-medium');\n    return () => {\n      link.classList.remove('!bg-primary/10');\n      link.classList.remove('!text-primary');\n      link.classList.remove('!font-medium');\n    };\n  };\n}\n\nexport { InstallationTabs };\n"
  },
  {
    "path": "apps/docs/components/link-tabs.tsx",
    "content": "'use client';\n\nimport * as React from 'react';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\n\nimport { cn } from '@docs/lib/utils';\nimport Link from 'next/link';\n\nfunction LinkTabs({\n  className,\n  ...props\n}: Omit<\n  React.ComponentProps<typeof TabsPrimitive.Root>,\n  'value' | 'defaultValue' | 'onValueChange' | 'activationMode'\n> & {\n  value: `/${string}`;\n}) {\n  return (\n    <TabsPrimitive.Root\n      className={cn('relative w-full', className)}\n      {...props}\n      activationMode=\"manual\"\n    />\n  );\n}\n\nfunction LinkTabsList({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.List>) {\n  return (\n    <TabsPrimitive.List\n      className={cn(\n        'text-muted-foreground inline-flex h-9 w-full items-center justify-start rounded-none border-b p-0',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction LinkTabsTrigger({ className, ...props }: React.ComponentProps<typeof Link>) {\n  return (\n    <TabsPrimitive.Trigger value={props.href.toString()} asChild>\n      <Link\n        className={cn(\n          'ring-offset-background focus-visible:ring-ring text-muted-foreground data-[state=active]:border-b-primary data-[state=active]:text-foreground relative inline-flex h-9 items-center justify-center whitespace-nowrap rounded-none border-b-2 border-b-transparent px-4 py-1 pb-3 pt-2 text-sm font-semibold no-underline shadow-none transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-none',\n          className\n        )}\n        {...props}\n      />\n    </TabsPrimitive.Trigger>\n  );\n}\n\nfunction LinkTabsContent({\n  className,\n  ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n  return (\n    <TabsPrimitive.Content\n      className={cn(\n        'ring-offset-background focus-visible:ring-ring relative mt-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 [&_h3.font-heading]:text-base [&_h3.font-heading]:font-semibold',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nexport { LinkTabs, LinkTabsList, LinkTabsTrigger, LinkTabsContent };\n"
  },
  {
    "path": "apps/docs/components/platform-select.tsx",
    "content": "'use client';\n\nimport { Button } from '@docs/components/ui/button';\nimport {\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n} from '@docs/components/ui/select';\nimport { type SelectProps } from '@radix-ui/react-select';\nimport { useReactiveGetCookie, useReactiveSetCookie } from 'cookies-next/client';\nimport * as React from 'react';\n\nconst PLATFORMS = [\n  { name: 'web', label: 'Web' },\n  { name: 'native', label: 'Native' },\n] as const;\n\ntype Platform = (typeof PLATFORMS)[number]['name'];\n\nexport function PlatformSelect(props: SelectProps) {\n  const [isClient, setIsClient] = React.useState(false);\n  const [platform, onPlatformChange] = usePlatform();\n\n  React.useEffect(() => {\n    setIsClient(true);\n  }, []);\n\n  return (\n    <Select {...props} defaultValue=\"web\" value={platform} onValueChange={onPlatformChange}>\n      <Button asChild variant=\"outline\" size=\"sm\">\n        <SelectTrigger className=\"dark:bg-muted dark:hover:bg-muted/80 dark:border-muted-foreground/15 w-fit\">\n          <span className=\"text-muted-foreground flex-1 pr-1\">Platform:</span>\n          {!isClient ? (\n            <span className=\"opacity-50\">\n              {\n                PLATFORMS.find((platform) =>\n                  platform.name === props.value ? props.value : props.defaultValue\n                )?.label\n              }\n            </span>\n          ) : (\n            <SelectValue placeholder=\"Select platform\" />\n          )}\n        </SelectTrigger>\n      </Button>\n      <SelectContent onCloseAutoFocus={preventDefault} className=\"dark:bg-neutral-900\">\n        {PLATFORMS.map((platform) => (\n          <SelectItem key={platform.name} value={platform.name} className=\"text-xs\">\n            {platform.label}\n          </SelectItem>\n        ))}\n      </SelectContent>\n    </Select>\n  );\n}\n\nexport function usePlatform() {\n  const getCookie = useReactiveGetCookie();\n  const setCookie = useReactiveSetCookie();\n  const platform = getCookie('user.platform') ?? 'web';\n  function onPlatformChange(value: Platform) {\n    setCookie('user.platform', value);\n  }\n  return [platform, onPlatformChange] as const;\n}\n\nfunction preventDefault(e: Event) {\n  e.preventDefault();\n}\n"
  },
  {
    "path": "apps/docs/components/play-store-button.tsx",
    "content": "import Image from 'next/image';\n\nexport function PlayStoreButton() {\n  return (\n    <a\n      href=\"https://play.google.com/store/apps/details?id=com.reactnativereusables.android\"\n      target=\"_blank\"\n      className=\"relative aspect-[16/5] h-10 rounded-sm sm:h-12\">\n      <Image alt=\"Get it on Google Play\" src={'/google-play-badge.png'} fill />\n    </a>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components/portal-info-alert.tsx",
    "content": "import { Callout } from '@docs/components/callout';\nimport Link from 'next/link';\n\nexport function PortalInfoAlert() {\n  return (\n    <Callout type=\"warn\" title=\"Portal Setup Required\">\n      A{' '}\n      <Link\n        href=\"/docs/installation/manual#add-the-portal-host-to-your-root-layout\"\n        className=\"hover:underline\">\n        <code className=\"bg-muted rounded-sm px-1 py-0.5 text-[0.813rem]\">PortalHost</code>\n      </Link>{' '}\n      must be added at the root of your app to support portal rendering on native platforms. Without\n      it, components that rely on portals, like this one, will not render correctly.\n    </Callout>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components/preview-card.tsx",
    "content": "'use client';\n\nimport { RnrIcon } from '@docs/components/icons/rnr-icon';\nimport { PlatformSelect, usePlatform } from '@docs/components/platform-select';\nimport { useParams } from 'next/navigation';\nimport { QRCodeSVG } from 'qrcode.react';\nimport * as React from 'react';\n\ntype PreviewCardProps = {\n  preview: React.ReactNode;\n};\n\nexport function PreviewCard({ preview }: PreviewCardProps) {\n  const { width } = useWindowSize();\n  const isDark = useIsDarkMode();\n  const params = useParams<{ slug: string[] }>();\n  const [platform] = usePlatform();\n\n  const component = params.slug.at(-1);\n\n  return (\n    <>\n      <div className=\"group/copy bg-card not-prose relative flex min-h-[450px] flex-col rounded-md border p-4\">\n        <div className=\"absolute -top-11 right-0 mt-px hidden items-center justify-end sm:flex\">\n          <PlatformSelect />\n        </div>\n        <div className=\"flex flex-1 flex-col items-center justify-center\">\n          {platform === 'native' && width >= 640 ? (\n            <div className=\"flex max-w-sm flex-col items-center gap-6 p-4\">\n              <QRCodeSVG\n                value={`https://reactnativereusables.com/showcase/links/${component}`}\n                bgColor={isDark ? 'black' : 'white'}\n                fgColor={isDark ? 'white' : 'black'}\n                size={230}\n                level=\"H\"\n              />\n              <p className=\"text-center font-mono text-sm\">Scan to preview.</p>\n            </div>\n          ) : (\n            preview\n          )}\n        </div>\n      </div>\n      <a\n        href={`https://reactnativereusables.com/showcase/links/${component}`}\n        target=\"_blank\"\n        className=\"not-prose bg-primary text-primary-foreground focus-visible:border-ring focus-visible:ring-ring/50 mt-4 inline-flex w-full shrink-0 items-center gap-2.5 rounded-lg p-2.5 text-sm font-medium shadow-sm outline-none transition-all focus-visible:ring-[3px] sm:hidden dark:p-2 [&_svg]:shrink-0\">\n        <div className=\"bg-primary flex items-center justify-center rounded-lg p-1 shadow-md dark:bg-black dark:p-2\">\n          <RnrIcon className=\"size-11 text-white dark:size-10\" pathClassName=\"stroke-1\" />\n        </div>\n        <div className=\"flex flex-col gap-1\">\n          <p className=\"leading-none\">Tap to preview in the app</p>\n          <p className=\"text-[1.3rem] font-semibold leading-none\">React Native Reusables</p>\n        </div>\n      </a>\n    </>\n  );\n}\n\nexport function BlockPreviewCard({ preview }: PreviewCardProps) {\n  return (\n    <div className=\"group/copy bg-card not-prose relative flex min-h-[450px] flex-col rounded-md border\">\n      <div className=\"flex flex-1 flex-col items-center justify-center py-6 sm:px-4 sm:py-8\">\n        {preview}\n      </div>\n    </div>\n  );\n}\n\ntype WindowSize = {\n  width: number;\n  height: number;\n};\n\nfunction useWindowSize(): WindowSize {\n  const [size, setSize] = React.useState<WindowSize>({\n    width: window.innerWidth,\n    height: window.innerHeight,\n  });\n\n  React.useEffect(() => {\n    function handleResize() {\n      setSize({\n        width: window.innerWidth,\n        height: window.innerHeight,\n      });\n    }\n\n    window.addEventListener('resize', handleResize);\n    return () => {\n      window.removeEventListener('resize', handleResize);\n    };\n  }, []);\n\n  return size;\n}\n\nexport function useIsDarkMode(): boolean {\n  const [isDark, setIsDark] = React.useState(() =>\n    document.documentElement.classList.contains('dark')\n  );\n\n  React.useEffect(() => {\n    const htmlEl = document.documentElement;\n\n    const updateDarkMode = () => {\n      setIsDark(htmlEl.classList.contains('dark'));\n    };\n\n    updateDarkMode();\n\n    const observer = new MutationObserver((mutations) => {\n      for (const mutation of mutations) {\n        if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n          updateDarkMode();\n        }\n      }\n    });\n\n    observer.observe(htmlEl, { attributes: true, attributeFilter: ['class'] });\n\n    return () => {\n      observer.disconnect();\n    };\n  }, []);\n\n  return isDark;\n}\n"
  },
  {
    "path": "apps/docs/components/safe-area-provider.tsx",
    "content": "'use client';\n\nexport { SafeAreaProvider } from 'react-native-safe-area-context';\n"
  },
  {
    "path": "apps/docs/components/skip-navigation-button.tsx",
    "content": "import { Button } from './ui/button';\n\nexport function SkipNavigationButton() {\n  return (\n    <Button\n      asChild\n      variant=\"secondary\"\n      className=\"absolute -left-60 top-3.5 z-50 mt-px px-4 py-2 transition-none focus:left-4 focus:outline-none\"\n      aria-label=\"Skip navigation\">\n      <a href=\"#nd-page\">Skip navigation</a>\n    </Button>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components/styling-library-tabs.tsx",
    "content": "'use client';\n\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@docs/components/ui/tabs';\nimport * as React from 'react';\nimport { useStylingLibrary } from './use-styling-library';\n\nexport function StylingLibraryTabs({ children }: React.PropsWithChildren) {\n  const [stylingLibrary, onStylingLibraryChange] = useStylingLibrary();\n  return (\n    <Tabs value={stylingLibrary} onValueChange={onStylingLibraryChange}>\n      <div className=\"flex items-center justify-between\">\n        <TabsList>\n          <TabsTrigger id=\"nativewind\" value=\"nativewind\">\n            Nativewind\n          </TabsTrigger>\n          <TabsTrigger id=\"uniwind\" value=\"uniwind\">\n            Uniwind\n          </TabsTrigger>\n        </TabsList>\n      </div>\n      {children}\n    </Tabs>\n  );\n}\n\nexport function StylingLibraryTabsNativewindContent({ children }: React.PropsWithChildren) {\n  const [stylingLibrary] = useStylingLibrary();\n\n  if (stylingLibrary !== 'nativewind') {\n    return null;\n  }\n  return <TabsContent value=\"nativewind\">{children}</TabsContent>;\n}\n\nexport function StylingLibraryTabsUnwindContent({ children }: React.PropsWithChildren) {\n  const [stylingLibrary] = useStylingLibrary();\n\n  if (stylingLibrary !== 'uniwind') {\n    return null;\n  }\n\n  return <TabsContent value=\"uniwind\">{children}</TabsContent>;\n}\n"
  },
  {
    "path": "apps/docs/components/ui/alert.tsx",
    "content": "import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@docs/lib/utils';\n\nconst alertVariants = cva(\n  'not-prose [&>svg]:text-foreground relative w-full rounded-lg border p-4 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>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 ref={ref} role=\"alert\" className={cn(alertVariants({ variant }), className)} {...props} />\n));\nAlert.displayName = 'Alert';\n\nconst AlertTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n  ({ className, ...props }, ref) => (\n    <h5\n      ref={ref}\n      className={cn('mb-1 font-medium leading-none tracking-tight', className)}\n      {...props}\n    />\n  )\n);\nAlertTitle.displayName = 'AlertTitle';\n\nconst AlertDescription = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n  <div ref={ref} className={cn('text-sm [&_p]:leading-relaxed', className)} {...props} />\n));\nAlertDescription.displayName = 'AlertDescription';\n\nexport { Alert, AlertTitle, AlertDescription };\n"
  },
  {
    "path": "apps/docs/components/ui/badge.tsx",
    "content": "import { cn } from '@docs/lib/utils';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nconst badgeVariants = cva(\n  'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden whitespace-nowrap rounded-md border px-2 py-0.5 text-xs font-medium transition-[color,box-shadow] focus-visible:ring-[3px] [&>svg]:pointer-events-none [&>svg]:size-3',\n  {\n    variants: {\n      variant: {\n        default: 'bg-primary text-primary-foreground [a&]:hover:bg-primary/90 border-transparent',\n        secondary:\n          'bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90 border-transparent',\n        destructive:\n          'bg-destructive [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60 border-transparent text-white',\n        outline: 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n    },\n  }\n);\n\nexport interface BadgeProps\n  extends React.HTMLAttributes<HTMLDivElement>,\n    VariantProps<typeof badgeVariants> {}\n\nfunction Badge({\n  className,\n  variant,\n  asChild = false,\n  ...props\n}: React.ComponentProps<'span'> & VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n  const Comp = asChild ? Slot : 'span';\n  return (\n    <Comp data-slot=\"badge\" className={cn(badgeVariants({ variant }), className)} {...props} />\n  );\n}\n\nexport { Badge, badgeVariants };\n"
  },
  {
    "path": "apps/docs/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 '@docs/lib/utils';\n\nconst buttonVariants = cva(\n  \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium outline-none transition-all focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n  {\n    variants: {\n      variant: {\n        default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',\n        destructive:\n          'bg-destructive shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60 text-white',\n        outline:\n          'bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 border',\n        secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',\n        ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n        link: 'text-primary underline-offset-4 hover:underline',\n      },\n      size: {\n        default: 'h-10 px-4 py-2 has-[>svg]:px-3 sm:h-9',\n        sm: 'h-9 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5 sm:h-8',\n        lg: 'h-11 rounded-md px-6 has-[>svg]:px-4 sm:h-10',\n        icon: 'h-10 w-10 sm:h-9 sm:w-9',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n);\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n    VariantProps<typeof buttonVariants> {\n  asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  ({ className, variant, size, asChild = false, ...props }, ref) => {\n    const Comp = asChild ? Slot : 'button';\n    return (\n      <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n    );\n  }\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n"
  },
  {
    "path": "apps/docs/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 '@docs/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 bg-background ring-offset-background placeholder:text-muted-foreground focus:ring-ring flex h-10 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n      className\n    )}\n    {...props}>\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('flex cursor-default items-center justify-center py-1', className)}\n    {...props}>\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('flex cursor-default items-center justify-center py-1', className)}\n    {...props}>\n    <ChevronDown className=\"h-4 w-4\" />\n  </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName = 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-96 min-w-[8rem] overflow-hidden 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      <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        {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('py-1.5 pl-8 pr-2 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 select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n      className\n    )}\n    {...props}>\n    <span className=\"absolute left-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\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  SelectGroup,\n  SelectValue,\n  SelectTrigger,\n  SelectContent,\n  SelectLabel,\n  SelectItem,\n  SelectSeparator,\n  SelectScrollUpButton,\n  SelectScrollDownButton,\n};\n"
  },
  {
    "path": "apps/docs/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 '@docs/lib/utils';\n\nfunction Tabs({ className, ...props }: 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({ className, ...props }: 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({ className, ...props }: 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 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 whitespace-nowrap rounded-md border border-transparent px-2 py-1 text-sm font-medium transition-[color,box-shadow] focus-visible:outline-1 focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm dark:data-[state=active]:border-neutral-700 dark:data-[state=active]:bg-neutral-600/30 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n  return (\n    <TabsPrimitive.Content\n      data-slot=\"tabs-content\"\n      className={cn('flex-1 outline-none [&>figure]:my-0', className)}\n      {...props}\n    />\n  );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n"
  },
  {
    "path": "apps/docs/components/use-styling-library.ts",
    "content": "import { useReactiveGetCookie, useReactiveSetCookie } from 'cookies-next';\n\nexport function useStylingLibrary() {\n  const getCookie = useReactiveGetCookie();\n  const setCookie = useReactiveSetCookie();\n  const stylingLibrary = getCookie('user.styling-library') ?? 'nativewind';\n  function onIntegrationChange(value: string) {\n    setCookie('user.styling-library', value === 'uniwind' ? 'uniwind' : 'nativewind');\n  }\n\n  return [stylingLibrary, onIntegrationChange] as const;\n}\n"
  },
  {
    "path": "apps/docs/components/vercel-oss-badge.tsx",
    "content": "// Needed to modify the fill. On some devices, the primary color did not fit with the selected theme\n\nexport function VercelOssBadge() {\n  return (\n    <a href=\"https://vercel.com/oss\" target=\"_blank\" className=\"block w-fit\">\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        width=\"240\"\n        height=\"24\"\n        viewBox=\"0 0 240 24\"\n        className=\"fill-fd-foreground\">\n        <path d=\"M126.243 10.3583H125.068L128.654 0H129.829L126.243 10.3583Z\" fillOpacity=\"0.5\" />\n        <path d=\"M133.507 10.3583H132.332L135.918 0H137.093L133.507 10.3583Z\" fillOpacity=\"0.5\" />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M156.511 0.472649C158.401 0.472655 159.589 2.21719 159.589 4.97938C159.589 7.71735 158.401 9.46185 156.511 9.46185C154.621 9.46185 153.434 7.71736 153.434 4.97938C153.434 2.21719 154.621 0.472649 156.511 0.472649ZM156.511 1.61138C155.385 1.61138 154.682 2.88351 154.682 4.97938C154.682 7.05103 155.385 8.32312 156.511 8.32312C157.638 8.32311 158.341 7.05103 158.341 4.97938C158.341 2.88352 157.638 1.61139 156.511 1.61138Z\"\n          fillOpacity=\"0.5\"\n        />\n        <path\n          d=\"M173.609 1.80541H169.913L169.586 4.24053C169.974 3.78017 170.689 3.53778 171.319 3.53777C172.881 3.53777 174.069 4.77346 174.069 6.49375C174.069 8.23829 172.821 9.46184 171.064 9.46185C169.501 9.46185 168.217 8.39595 168.084 7.02703L169.332 6.95427C169.453 7.80226 170.168 8.32312 171.173 8.32312C172.13 8.32305 172.821 7.57193 172.821 6.49375C172.821 5.39133 172.07 4.66438 171.028 4.66438C170.374 4.66438 169.707 5.02786 169.489 5.56087H168.229L168.896 0.666677H173.609V1.80541Z\"\n          fillOpacity=\"0.5\"\n        />\n        <path\n          d=\"M149.465 0.472649C151.076 0.472649 152.252 1.52671 152.252 2.95627C152.252 4.20408 151.282 5.06413 150.022 5.82736C149.392 6.19084 147.745 7.29347 147.684 8.12938H152.312V9.26812H146.206C146.206 6.67556 147.927 5.75481 149.477 4.77352C150.337 4.22836 151.016 3.61046 151.016 2.95627C151.016 2.1688 150.374 1.61138 149.465 1.61138C148.472 1.61141 147.805 2.24139 147.599 3.35587L146.364 3.27127C146.57 1.66001 147.708 0.472682 149.465 0.472649Z\"\n          fillOpacity=\"0.5\"\n        />\n        <path\n          d=\"M163.994 0.472649C165.605 0.472649 166.78 1.52671 166.78 2.95627C166.78 4.20408 165.811 5.06413 164.551 5.82736C163.921 6.19084 162.273 7.29347 162.213 8.12938H166.841V9.26812H160.735C160.735 6.67556 162.455 5.75481 164.006 4.77352C164.866 4.22836 165.544 3.61046 165.544 2.95627C165.544 2.1688 164.902 1.61138 163.994 1.61138C163 1.61141 162.334 2.24139 162.128 3.35587L160.892 3.27127C161.098 1.66001 162.237 0.472682 163.994 0.472649Z\"\n          fillOpacity=\"0.5\"\n        />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M40.2826 15.0106C42.2937 15.0106 43.4808 16.7551 43.4808 19.5173C43.4808 22.2553 42.2937 23.9998 40.2826 23.9998C38.2715 23.9998 37.0843 22.2553 37.0843 19.5173C37.0843 16.7551 38.2715 15.0106 40.2826 15.0106ZM40.2826 16.1493C39.0347 16.1493 38.3319 17.4215 38.3319 19.5173C38.3319 21.589 39.0347 22.8611 40.2826 22.8611C41.5304 22.8611 42.2332 21.589 42.2332 19.5173C42.2332 17.4215 41.5304 16.1493 40.2826 16.1493Z\"\n        />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M83.8684 15.0106C85.8795 15.0106 87.0666 16.7552 87.0666 19.5173C87.0666 22.2553 85.8795 23.9998 83.8684 23.9998C81.8573 23.9998 80.6701 22.2553 80.6701 19.5173C80.6701 16.7551 81.8573 15.0106 83.8684 15.0106ZM83.8684 16.1493C82.6205 16.1493 81.9177 17.4215 81.9177 19.5173C81.9177 21.589 82.6205 22.8611 83.8684 22.8611C85.1162 22.8611 85.819 21.589 85.819 19.5173C85.819 17.4215 85.1162 16.1494 83.8684 16.1493Z\"\n        />\n        <path d=\"M89.4124 20.8258C89.4124 22.1221 89.9818 22.8611 91.1327 22.8611C92.2836 22.8611 92.8529 22.1221 92.8529 20.8258V15.1925H94.0402V20.7895C94.0402 22.7642 92.9742 23.9998 91.1327 23.9998C89.2912 23.9998 88.2252 22.7642 88.2252 20.7895V15.1925H89.4124V20.8258Z\" />\n        <path d=\"M105.831 15.0106C107.369 15.0106 108.46 16.0768 108.86 17.7971L107.6 17.882C107.309 16.7553 106.679 16.1493 105.819 16.1493C104.462 16.1494 103.699 17.3488 103.699 19.5173C103.699 21.6737 104.462 22.861 105.819 22.8611C106.764 22.8611 107.418 22.1947 107.672 20.9589L108.92 21.0317C108.581 22.8611 107.466 23.9998 105.831 23.9998C103.686 23.9997 102.463 22.2674 102.463 19.5173C102.463 16.7431 103.686 15.0107 105.831 15.0106Z\" />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M134.718 15.0106C136.73 15.0106 137.917 16.7552 137.917 19.5173C137.917 22.2553 136.73 23.9998 134.718 23.9998C132.707 23.9998 131.52 22.2553 131.52 19.5173C131.52 16.7551 132.707 15.0106 134.718 15.0106ZM134.718 16.1493C133.471 16.1493 132.768 17.4215 132.768 19.5173C132.768 21.589 133.471 22.8611 134.718 22.8611C135.966 22.8611 136.669 21.589 136.669 19.5173C136.669 17.4215 135.966 16.1494 134.718 16.1493Z\"\n        />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M207.362 15.0106C209.373 15.0106 210.56 16.7552 210.56 19.5173C210.56 22.2553 209.373 23.9998 207.362 23.9998C205.35 23.9998 204.163 22.2553 204.163 19.5173C204.163 16.7551 205.35 15.0106 207.362 15.0106ZM207.362 16.1493C206.114 16.1493 205.411 17.4215 205.411 19.5173C205.411 21.589 206.114 22.8611 207.362 22.8611C208.609 22.8611 209.312 21.589 209.312 19.5173C209.312 17.4215 208.609 16.1494 207.362 16.1493Z\"\n        />\n        <path d=\"M214.699 15.0106C216.189 15.0106 217.388 16.1131 217.776 17.7728L216.528 17.8577C216.274 16.828 215.571 16.1494 214.711 16.1493C213.378 16.1493 212.651 17.373 212.651 19.5173C212.651 21.6496 213.378 22.8611 214.711 22.8611C215.789 22.861 216.552 21.8556 216.637 20.5351H214.686V19.4203H217.8V23.8061H216.964L216.819 22.6673C216.455 23.5153 215.74 23.9998 214.699 23.9998C212.687 23.9998 211.403 22.2553 211.403 19.5173C211.403 16.7551 212.687 15.0106 214.699 15.0106Z\" />\n        <path d=\"M76.4346 15.0106C78.167 15.0107 79.3784 16.1616 79.5601 17.7728L78.3364 17.8456C78.1911 16.8159 77.4158 16.1494 76.4103 16.1493C75.5865 16.1493 74.9081 16.6461 74.9202 17.4336C74.9323 18.4028 75.9863 18.6814 77.0161 18.948C78.482 19.3599 79.7177 20.1717 79.7177 21.4922C79.7177 23.1034 78.3001 23.9513 76.8221 23.9513C75.017 23.9513 73.6601 22.8005 73.5147 21.0317L74.7383 20.9589C74.9564 22.0735 75.7076 22.8126 76.8948 22.8126C77.8277 22.8126 78.4941 22.4006 78.4941 21.5889C78.4941 20.7652 77.7913 20.2685 76.2891 19.8687C74.9322 19.5174 73.6966 18.8026 73.6966 17.4215C73.6966 15.9434 74.8596 15.0106 76.4346 15.0106Z\" />\n        <path d=\"M127.285 15.0106C129.017 15.0107 130.228 16.1616 130.41 17.7728L129.187 17.8456C129.041 16.8159 128.266 16.1494 127.26 16.1493C126.437 16.1493 125.758 16.6461 125.77 17.4336C125.782 18.4028 126.836 18.6814 127.866 18.948C129.332 19.3599 130.568 20.1717 130.568 21.4922C130.568 23.1034 129.15 23.9513 127.672 23.9513C125.867 23.9513 124.51 22.8005 124.365 21.0317L125.588 20.9589C125.806 22.0735 126.558 22.8126 127.745 22.8126C128.678 22.8126 129.344 22.4006 129.344 21.5889C129.344 20.7652 128.641 20.2685 127.139 19.8687C125.782 19.5174 124.547 18.8026 124.547 17.4215C124.547 15.9434 125.71 15.0106 127.285 15.0106Z\" />\n        <path d=\"M26.6531 23.8061H0L13.3266 0.787657L26.6531 23.8061Z\" />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M47.6318 15.2046C49.5338 15.2047 50.6848 16.2101 50.6848 17.8456C50.6847 19.5174 49.5337 20.5472 47.6318 20.5472H46.1416V23.8061H44.9544V15.2046H47.6318ZM46.1416 19.4085H47.5954C48.8189 19.4085 49.4369 18.8753 49.4369 17.8456C49.4369 16.8522 48.819 16.3434 47.5954 16.3434H46.1416V19.4085Z\"\n        />\n        <path d=\"M57.6944 16.3434H53.4059V18.9358H57.5492V20.0506H53.4059V22.6673H57.7914V23.8061H52.2187V15.2046H57.6944V16.3434Z\" />\n        <path d=\"M63.6262 22.1222V15.2046H64.8135V23.8061H63.1293L60.5247 17.155V23.8061H59.3375V15.2046H60.9125L63.6262 22.1222Z\" />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M98.3727 15.2046C100.178 15.2046 101.317 16.2101 101.317 17.8092C101.317 18.8026 100.675 19.5779 99.9235 19.8202C100.735 19.9777 101.087 20.4139 101.171 21.2982L101.414 23.8061H100.214L99.9963 21.4195C99.9236 20.6683 99.4387 20.4138 98.2636 20.4138H96.7977V23.8061H95.6105V15.2046H98.3727ZM96.7977 19.2872H98.3606C99.4509 19.2872 100.069 18.7542 100.069 17.8214C100.069 16.8764 99.451 16.3434 98.3606 16.3434H96.7977V19.2872Z\"\n        />\n        <path d=\"M115.809 16.3434H111.52V18.9358H115.664V20.0506H111.52V22.6673H115.906V23.8061H110.333V15.2046H115.809V16.3434Z\" />\n        <path d=\"M144.806 16.3434H140.65V19.045H144.587V20.1595H140.65V23.8061H139.451V15.2046H144.806V16.3434Z\" />\n        <path d=\"M152.385 16.3434H149.841V23.8061H148.653V16.3434H146.109V15.2046H152.385V16.3434Z\" />\n        <path d=\"M155.142 22.2675L155.978 15.9314H157.044L157.88 22.2675L158.571 15.2046H159.782L158.91 23.8061H157.214L156.511 17.9908L155.809 23.8061H154.113L153.24 15.2046H154.452L155.142 22.2675Z\" />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M167.132 23.8061H165.908L165.242 21.5165H162.31L161.643 23.8061H160.42L163.037 15.2046H164.515L167.132 23.8061ZM162.613 20.4745H164.939L163.776 16.4643L162.613 20.4745Z\"\n        />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M171.016 15.2046C172.821 15.2046 173.96 16.2101 173.96 17.8092C173.96 18.8026 173.318 19.5779 172.567 19.8202C173.378 19.9777 173.73 20.4139 173.814 21.2982L174.057 23.8061H172.857L172.639 21.4195C172.567 20.6684 172.082 20.4138 170.907 20.4138H169.441V23.8061H168.253V15.2046H171.016ZM169.441 19.2872H171.004C172.094 19.2872 172.712 18.7542 172.712 17.8214C172.712 16.8764 172.094 16.3434 171.004 16.3434H169.441V19.2872Z\"\n        />\n        <path d=\"M181.188 16.3434H176.899V18.9358H181.042V20.0506H176.899V22.6673H181.285V23.8061H175.712V15.2046H181.188V16.3434Z\" />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M192.918 15.2046C194.82 15.2047 195.971 16.2101 195.971 17.8456C195.971 19.5174 194.82 20.5472 192.918 20.5472H191.428V23.8061H190.24V15.2046H192.918ZM191.428 19.4085H192.881C194.105 19.4085 194.723 18.8753 194.723 17.8456C194.723 16.8522 194.105 16.3434 192.881 16.3434H191.428V19.4085Z\"\n        />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M200.073 15.2046C201.878 15.2046 203.017 16.2101 203.017 17.8092C203.017 18.8026 202.375 19.5779 201.624 19.8202C202.435 19.9777 202.787 20.4139 202.872 21.2982L203.114 23.8061H201.914L201.696 21.4195C201.624 20.6684 201.139 20.4138 199.964 20.4138H198.498V23.8061H197.311V15.2046H200.073ZM198.498 19.2872H200.061C201.151 19.2872 201.769 18.7542 201.769 17.8214C201.769 16.8764 201.151 16.3434 200.061 16.3434H198.498V19.2872Z\"\n        />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M221.866 15.2046C223.671 15.2046 224.81 16.2101 224.81 17.8092C224.81 18.8026 224.168 19.5779 223.417 19.8202C224.228 19.9777 224.58 20.4139 224.665 21.2982L224.907 23.8061H223.707L223.489 21.4195C223.417 20.6684 222.932 20.4138 221.757 20.4138H220.291V23.8061H219.104V15.2046H221.866ZM220.291 19.2872H221.854C222.944 19.2872 223.562 18.7542 223.562 17.8214C223.562 16.8764 222.944 16.3434 221.854 16.3434H220.291V19.2872Z\"\n        />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M232.51 23.8061H231.287L230.62 21.5165H227.689L227.022 23.8061H225.799L228.415 15.2046H229.894L232.51 23.8061ZM227.991 20.4745H230.317L229.154 16.4643L227.991 20.4745Z\"\n        />\n        <path d=\"M236.419 21.1408L237.533 15.2046H239.338V23.8061H238.151V16.6826L236.891 23.2003H235.934L234.686 16.6826V23.8061H233.499V15.2046H235.304L236.419 21.1408Z\" />\n        <path d=\"M62.245 0.472656C63.7836 0.472656 64.8739 1.53883 65.2737 3.25916L64.014 3.34404C63.7232 2.21735 63.093 1.61139 62.2328 1.61139C60.876 1.61146 60.1127 2.8109 60.1127 4.97938C60.1127 7.13578 60.876 8.32305 62.2328 8.32312C63.1778 8.32312 63.8321 7.65672 64.0865 6.42099L65.3344 6.49375C64.9951 8.32311 63.8805 9.46186 62.245 9.46186C60.1007 9.4618 58.8772 7.72943 58.8772 4.97938C58.8772 2.20513 60.1007 0.472716 62.245 0.472656Z\" />\n        <path d=\"M105.831 0.472656C107.369 0.472656 108.46 1.53883 108.86 3.25916L107.6 3.34404C107.309 2.21735 106.679 1.61139 105.819 1.61139C104.462 1.61146 103.699 2.8109 103.699 4.97938C103.699 7.13578 104.462 8.32305 105.819 8.32312C106.764 8.32312 107.418 7.65672 107.672 6.42099L108.92 6.49375C108.581 8.32311 107.466 9.46186 105.831 9.46186C103.686 9.4618 102.463 7.72943 102.463 4.97938C102.463 2.20513 103.686 0.472716 105.831 0.472656Z\" />\n        <path d=\"M40.2826 7.81439L42.3663 0.666685H43.6506L41.0096 9.26813H39.5555L36.9145 0.666685H38.1988L40.2826 7.81439Z\" />\n        <path d=\"M50.4301 1.80542H46.1416V4.39789H50.2849V5.51267H46.1416V8.12939H50.5271V9.26813H44.9544V0.666685H50.4301V1.80542Z\" />\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M54.7869 0.666685C56.5921 0.666685 57.7308 1.67211 57.7308 3.27128C57.7308 4.26468 57.0888 5.03995 56.3377 5.28226C57.1494 5.43975 57.5007 5.87593 57.5856 6.76025L57.8278 9.26813H56.6284L56.4104 6.88152C56.3378 6.13039 55.8529 5.87588 54.6778 5.87588H53.2119V9.26813H52.0246V0.666685H54.7869ZM53.2119 4.74927H54.7748C55.8651 4.74927 56.4829 4.21624 56.4829 3.28341C56.4829 2.33844 55.8651 1.80542 54.7748 1.80542H53.2119V4.74927Z\"\n        />\n        <path d=\"M72.223 1.80542H67.9345V4.39789H72.0778V5.51267H67.9345V8.12939H72.32V9.26813H66.7473V0.666685H72.223V1.80542Z\" />\n        <path d=\"M75.2352 8.12939H79.6692V9.26813H74.048V0.666685H75.2352V8.12939Z\" />\n        <path d=\"M93.6648 1.80542H91.7263V8.12939H93.7373V9.26813H88.5402V8.12939H90.5391V1.80542H88.6005V0.666685H93.6648V1.80542Z\" />\n        <path d=\"M99.9477 7.58428V0.666685H101.135V9.26813H99.4508L96.8462 2.61703V9.26813H95.659V0.666685H97.234L99.9477 7.58428Z\" />\n        <path d=\"M113.689 9.26813H112.162V7.79014H113.689V9.26813Z\" />\n      </svg>\n    </a>\n  );\n}\n"
  },
  {
    "path": "apps/docs/components.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema.json\",\n  \"style\": \"default\",\n  \"rsc\": true,\n  \"tsx\": true,\n  \"tailwind\": {\n    \"config\": \"tailwind.config.js\",\n    \"css\": \"app/global.css\",\n    \"baseColor\": \"neutral\",\n    \"cssVariables\": true,\n    \"prefix\": \"\"\n  },\n  \"aliases\": {\n    \"components\": \"@docs/components\",\n    \"utils\": \"@docs/lib/utils\",\n    \"ui\": \"@docs/components/ui\",\n    \"lib\": \"@docs/lib\",\n    \"hooks\": \"@docs/hooks\"\n  },\n  \"iconLibrary\": \"lucide\"\n}\n"
  },
  {
    "path": "apps/docs/content/docs/blocks/authentication/forgot-password-form.mdx",
    "content": "---\ntitle: Forgot password form\ndescription: A form that sends a password reset OTP to the user's email address.\n---\n\nimport { BlockPreviewCard } from '@docs/components/preview-card';\nimport { ForgotPasswordForm } from \"@docs/components/blocks\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';                                                                                        \nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { AuthBlockTabs, AuthBlockTabsCliContent, AuthBlockTabsManualContent } from '@docs/components/auth-block-tabs';\nimport { Callout } from '@docs/components/callout';\n\n<ExternalLinks links={[{ title: 'Clerk docs', url: 'https://go.clerk.com/Q1MKAz0' }]} />\n\n<div className=\"h-5\" />\n\n<div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n  ## Preview\n</div>\n    \n<BlockPreviewCard preview={<div className=\"w-full max-w-sm\"><ForgotPasswordForm /></div>} />\n\n\n## Installation\n\n<AuthBlockTabs>\n  <AuthBlockTabsCliContent integration=\"none\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"forgot-password-form\"]}/>\n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `ForgotPasswordForm` in your app.\n\n        ```tsx\n        import { ForgotPasswordForm } from '@/components/forgot-password-form';\n        import { ScrollView, View } from 'react-native';\n\n        export default function ForgotPasswordScreen() {\n          return (\n            <ScrollView\n              keyboardShouldPersistTaps=\"handled\"\n              contentContainerClassName=\"sm:flex-1 items-center justify-center p-4 py-8 sm:py-4 sm:p-6 mt-safe\"\n              keyboardDismissMode=\"interactive\">\n              <View className=\"w-full max-w-sm\">\n                <ForgotPasswordForm />\n              </View>\n            </ScrollView>\n          );\n        }\n        ```\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n  <AuthBlockTabsCliContent integration=\"clerk\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"forgot-password-form-clerk\"]}/>\n      </Step>\n      <Step>\n        **If you haven't already**\n\n        Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `ForgotPasswordForm` in your app.\n\n        ```tsx\n        import { ForgotPasswordForm } from '@/components/forgot-password-form';\n        import { ScrollView, View } from 'react-native';\n\n        export default function ForgotPasswordScreen() {\n          return (\n            <ScrollView\n              keyboardShouldPersistTaps=\"handled\"\n              contentContainerClassName=\"sm:flex-1 items-center justify-center p-4 py-8 sm:py-4 sm:p-6 mt-safe\"\n              keyboardDismissMode=\"interactive\">\n              <View className=\"w-full max-w-sm\">\n                <ForgotPasswordForm />\n              </View>\n            </ScrollView>\n          );\n        }\n        ```\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n\n  <AuthBlockTabsManualContent integration=\"none\">\n\n    <Steps>\n      <Step>\n        **If missing, add the following components:**\n\n        - [`Button`](/docs/components/button)\n        - [`Card`](/docs/components/card)\n        - [`Input`](/docs/components/input)\n        - [`Label`](/docs/components/label)\n        - [`Text`](/docs/components/text)\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/forgot-password-form.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/forgot-password-form.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n\n  </AuthBlockTabsManualContent>\n  <AuthBlockTabsManualContent integration=\"clerk\">\n\n    <Steps>\n      <Step>\n        **If you haven't already**\n\n        - Install the Clerk package:\n\n        ```bash\n        npx expo install @clerk/clerk-expo\n        ```\n\n        - Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n\n      <Step>\n        **If missing, add the following components:**\n\n        - [`Button`](/docs/components/button)\n        - [`Card`](/docs/components/card)\n        - [`Input`](/docs/components/input)\n        - [`Label`](/docs/components/label)\n        - [`Text`](/docs/components/text)\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/clerk/forgot-password-form.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/forgot-password-form.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n    \n  </AuthBlockTabsManualContent>\n</AuthBlockTabs>"
  },
  {
    "path": "apps/docs/content/docs/blocks/authentication/index.mdx",
    "content": "---\ntitle: Authentication\ndescription: Copy and paste or add them with the CLI.\n---\n\nimport { Callout } from \"@docs/components/callout\"\nimport { BlocksGrid } from \"@docs/components/blocks-grid\"\nimport { CommandTabs } from \"@docs/components/command-tabs\"\nimport { ClerkLogo } from \"@docs/components/clerk-logo\"\n\n## Blocks\n\n<BlocksGrid />\n\n<div className=\"h-16\"/>\n\n<div className='hidden'>\n## Clerk\n</div>\n\n<a href=\"https://go.clerk.com/gjgxNgT\" target=\"_blank\" className='block w-fit'>\n<ClerkLogo />\n</a>\n<span className=\"text-fd-muted-foreground block h-12 pt-3\">Optional integration.</span>\n\nSelect **Clerk** from the integration menu to get blocks built with Clerk authentication logic.\n\nAfter adding your first block, follow the [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to complete the setup.\n\n<div className=\"h-1\"/>\n\n<Callout title=\"Starting a new project?\">\n\nStart a new project with all Clerk authentication blocks pre-configured using the [clerk-auth](https://github.com/founded-labs/react-native-reusables-templates/tree/main/clerk-auth#clerk-auth-template) template.\n\n<CommandTabs args={[\"init\", \"-t\", \"clerk-auth\"]} />\n\n</Callout>"
  },
  {
    "path": "apps/docs/content/docs/blocks/authentication/meta.json",
    "content": "{\n  \"pages\": [\n    \"sign-in-form\",\n    \"sign-up-form\",\n    \"verify-email-form\",\n    \"reset-password-form\",\n    \"forgot-password-form\",\n    \"social-connections\",\n    \"user-menu\"\n  ]\n}\n"
  },
  {
    "path": "apps/docs/content/docs/blocks/authentication/reset-password-form.mdx",
    "content": "---\ntitle: Reset password form\ndescription: A form for resetting a password with an OTP sent via email.\n---\n\nimport { BlockPreviewCard } from '@docs/components/preview-card';\nimport { ResetPasswordForm } from \"@docs/components/blocks\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';                                                                                 \nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { AuthBlockTabs, AuthBlockTabsCliContent, AuthBlockTabsManualContent } from '@docs/components/auth-block-tabs';\nimport { Callout } from '@docs/components/callout';\n\n<ExternalLinks links={[{ title: 'Clerk docs', url: 'https://go.clerk.com/Q1MKAz0' }]} />\n\n<div className=\"h-5\" />\n\n<div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n  ## Preview\n</div>\n    \n<BlockPreviewCard preview={<div className=\"w-full max-w-sm\"><ResetPasswordForm /></div>} />\n\n\n## Installation\n\n<AuthBlockTabs>\n  <AuthBlockTabsCliContent integration=\"none\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"reset-password-form\"]}/>\n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `ResetPasswordForm` in your app.\n\n        ```tsx\n        import { ResetPasswordForm } from '@/components/reset-password-form';\n        import { ScrollView, View } from 'react-native';\n\n        export default function ResetPasswordScreen() {\n          return (\n            <ScrollView\n              keyboardShouldPersistTaps=\"handled\"\n              contentContainerClassName=\"sm:flex-1 items-center justify-center p-4 py-8 sm:py-4 sm:p-6 mt-safe\"\n              keyboardDismissMode=\"interactive\">\n              <View className=\"w-full max-w-sm\">\n                <ResetPasswordForm />\n              </View>\n            </ScrollView>\n          );\n        }\n        ```\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n  <AuthBlockTabsCliContent integration=\"clerk\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"reset-password-form-clerk\"]}/>\n      </Step>\n      <Step>\n        **If you haven't already**\n\n        Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `ResetPasswordForm` in your app.\n\n        ```tsx\n        import { ResetPasswordForm } from '@/components/reset-password-form';\n        import { ScrollView, View } from 'react-native';\n\n        export default function ResetPasswordScreen() {\n          return (\n            <ScrollView\n              keyboardShouldPersistTaps=\"handled\"\n              contentContainerClassName=\"sm:flex-1 items-center justify-center p-4 py-8 sm:py-4 sm:p-6 mt-safe\"\n              keyboardDismissMode=\"interactive\">\n              <View className=\"w-full max-w-sm\">\n                <ResetPasswordForm />\n              </View>\n            </ScrollView>\n          );\n        }\n        ```\n\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n\n  <AuthBlockTabsManualContent integration=\"none\">\n\n    <Steps>\n      <Step>\n        **If missing, add the following components:**\n\n        - [`Button`](/docs/components/button)\n        - [`Card`](/docs/components/card)\n        - [`Input`](/docs/components/input)\n        - [`Label`](/docs/components/label)\n        - [`Text`](/docs/components/text)\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/reset-password-form.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/reset-password-form.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n\n  </AuthBlockTabsManualContent>\n  <AuthBlockTabsManualContent integration=\"clerk\">\n\n    <Steps>\n      <Step>\n        **If you haven't already**\n\n        - Install the Clerk package:\n\n        ```bash\n        npx expo install @clerk/clerk-expo\n        ```\n\n        - Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n\n      <Step>\n        **If missing, add the following components:**\n\n        - [`Button`](/docs/components/button)\n        - [`Card`](/docs/components/card)\n        - [`Input`](/docs/components/input)\n        - [`Label`](/docs/components/label)\n        - [`Text`](/docs/components/text)\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/clerk/reset-password-form.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/reset-password-form.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n    \n  </AuthBlockTabsManualContent>\n</AuthBlockTabs>"
  },
  {
    "path": "apps/docs/content/docs/blocks/authentication/sign-in-form.mdx",
    "content": "---\ntitle: Sign in form\ndescription: A form for signing in using email and password or social providers.\n---\n\nimport { BlockPreviewCard } from '@docs/components/preview-card';\nimport { SignInForm } from \"@docs/components/blocks\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';                                                                                                          \nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { AuthBlockTabs, AuthBlockTabsCliContent, AuthBlockTabsManualContent } from '@docs/components/auth-block-tabs';\nimport { Callout } from '@docs/components/callout';\n\n<ExternalLinks links={[{ title: 'Clerk docs', url: 'https://go.clerk.com/Q1MKAz0' }]} />\n\n<div className=\"h-5\" />\n\n<div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n  ## Preview\n</div>\n    \n<BlockPreviewCard preview={<div className=\"w-full max-w-sm\"><SignInForm /></div>} />\n\n\n## Installation\n\n<AuthBlockTabs>\n  <AuthBlockTabsCliContent integration=\"none\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"sign-in-form\"]}/>\n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `SignInForm` in your app.\n\n        ```tsx\n        import { SignInForm } from '@/components/sign-in-form';\n        import { ScrollView, View } from 'react-native';\n\n        export default function SignInScreen() {\n          return (\n            <ScrollView\n              keyboardShouldPersistTaps=\"handled\"\n              contentContainerClassName=\"sm:flex-1 items-center justify-center p-4 py-8 sm:py-4 sm:p-6 mt-safe\"\n              keyboardDismissMode=\"interactive\">\n              <View className=\"w-full max-w-sm\">\n                <SignInForm />\n              </View>\n            </ScrollView>\n          );\n        }\n        ```\n\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n  <AuthBlockTabsCliContent integration=\"clerk\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"sign-in-form-clerk\"]}/>\n      </Step>\n      <Step>\n        **If you haven't already**\n\n        Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n      <Step>\n        **All set!**\n\n        You can now import `SignInForm` in your app.\n\n        ```tsx\n        import { SignInForm } from '@/components/sign-in-form';\n        import { ScrollView, View } from 'react-native';\n\n        export default function SignInScreen() {\n          return (\n            <ScrollView\n              keyboardShouldPersistTaps=\"handled\"\n              contentContainerClassName=\"sm:flex-1 items-center justify-center p-4 py-8 sm:py-4 sm:p-6 mt-safe\"\n              keyboardDismissMode=\"interactive\">\n              <View className=\"w-full max-w-sm\">\n                <SignInForm />\n              </View>\n            </ScrollView>\n          );\n        }\n        ```\n\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n\n  <AuthBlockTabsManualContent integration=\"none\">\n\n    <Steps>\n      <Step>\n        **If missing, add the following block and/or components:**\n\n        - [`SocialConnections`](/docs/blocks/authentication/social-connections)\n        - [`Button`](/docs/components/button)\n        - [`Card`](/docs/components/card)\n        - [`Input`](/docs/components/input)\n        - [`Label`](/docs/components/label)\n        - [`Separator`](/docs/components/separator)\n        - [`Text`](/docs/components/text)\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/sign-in-form.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/sign-in-form.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n\n    </Steps>\n\n  </AuthBlockTabsManualContent>\n  <AuthBlockTabsManualContent integration=\"clerk\">\n\n    <Steps>\n      <Step>\n        **If you haven't already**\n\n        - Install the Clerk package:\n\n        ```bash\n        npx expo install @clerk/clerk-expo\n        ```\n\n        - Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n\n      <Step>\n        **If missing, add the following block and/or components:**\n\n        - [`SocialConnections`](/docs/blocks/authentication/social-connections)\n        - [`Button`](/docs/components/button)\n        - [`Card`](/docs/components/card)\n        - [`Input`](/docs/components/input)\n        - [`Label`](/docs/components/label)\n        - [`Separator`](/docs/components/separator)\n        - [`Text`](/docs/components/text)\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/clerk/sign-in-form.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/sign-in-form.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n    \n  </AuthBlockTabsManualContent>\n</AuthBlockTabs>"
  },
  {
    "path": "apps/docs/content/docs/blocks/authentication/sign-up-form.mdx",
    "content": "---\ntitle: Sign up form\ndescription: A form for creating an account with email and password or social providers.\n---\n\nimport { BlockPreviewCard } from '@docs/components/preview-card';\nimport { SignUpForm } from \"@docs/components/blocks\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';                                                                               \nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { AuthBlockTabs, AuthBlockTabsCliContent, AuthBlockTabsManualContent } from '@docs/components/auth-block-tabs';\nimport { Callout } from '@docs/components/callout';\n\n<ExternalLinks links={[{ title: 'Clerk docs', url: 'https://go.clerk.com/Q1MKAz0' }]} />\n\n<div className=\"h-5\" />\n\n<div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n  ## Preview\n</div>\n    \n<BlockPreviewCard preview={<div className=\"w-full max-w-sm\"><SignUpForm /></div>} />\n\n\n## Installation\n\n<AuthBlockTabs>\n  <AuthBlockTabsCliContent integration=\"none\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"sign-up-form\"]}/>\n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `SignUpForm` in your app.\n\n        ```tsx\n        import { SignUpForm } from '@/components/sign-up-form';\n        import { ScrollView, View } from 'react-native';\n\n        export default function SignUpScreen() {\n          return (\n            <ScrollView\n              keyboardShouldPersistTaps=\"handled\"\n              contentContainerClassName=\"sm:flex-1 items-center justify-center p-4 py-8 sm:py-4 sm:p-6 mt-safe\"\n              keyboardDismissMode=\"interactive\">\n              <View className=\"w-full max-w-sm\">\n                <SignUpForm />\n              </View>\n            </ScrollView>\n          );\n        }\n        ```\n\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n  <AuthBlockTabsCliContent integration=\"clerk\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"sign-up-form-clerk\"]}/>\n      </Step>\n      <Step>\n        **If you haven't already**\n\n        Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `SignUpForm` in your app.\n\n        ```tsx\n        import { SignUpForm } from '@/components/sign-up-form';\n        import { ScrollView, View } from 'react-native';\n\n        export default function SignUpScreen() {\n          return (\n            <ScrollView\n              keyboardShouldPersistTaps=\"handled\"\n              contentContainerClassName=\"sm:flex-1 items-center justify-center p-4 py-8 sm:py-4 sm:p-6 mt-safe\"\n              keyboardDismissMode=\"interactive\">\n              <View className=\"w-full max-w-sm\">\n                <SignUpForm />\n              </View>\n            </ScrollView>\n          );\n        }\n        ```\n\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n\n  <AuthBlockTabsManualContent integration=\"none\">\n\n    <Steps>\n      <Step>\n        **If missing, add the following block and/or components:**\n\n        - [`SocialConnections`](/docs/blocks/authentication/social-connections)\n        - [`Button`](/docs/components/button)\n        - [`Card`](/docs/components/card)\n        - [`Input`](/docs/components/input)\n        - [`Label`](/docs/components/label)\n        - [`Separator`](/docs/components/separator)\n        - [`Text`](/docs/components/text)\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/sign-up-form.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/sign-up-form.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n\n  </AuthBlockTabsManualContent>\n  <AuthBlockTabsManualContent integration=\"clerk\">\n\n    <Steps>\n      <Step>\n        **If you haven't already**\n\n        - Install the Clerk package:\n\n        ```bash\n        npx expo install @clerk/clerk-expo\n        ```\n\n        - Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n\n      <Step>\n        **If missing, add the following block and/or components:**\n\n        - [`SocialConnections`](/docs/blocks/authentication/social-connections)\n        - [`Button`](/docs/components/button)\n        - [`Card`](/docs/components/card)\n        - [`Input`](/docs/components/input)\n        - [`Label`](/docs/components/label)\n        - [`Separator`](/docs/components/separator)\n        - [`Text`](/docs/components/text)\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/clerk/sign-up-form.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/sign-up-form.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n    \n  </AuthBlockTabsManualContent>\n</AuthBlockTabs>"
  },
  {
    "path": "apps/docs/content/docs/blocks/authentication/social-connections.mdx",
    "content": "---\ntitle: Social connections\ndescription: A set of buttons for authenticating through social providers.\n---\n\nimport { BlockPreviewCard } from '@docs/components/preview-card';\nimport { SocialConnections } from \"@docs/components/blocks\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';                                                                                    \nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { AuthBlockTabs, AuthBlockTabsCliContent, AuthBlockTabsManualContent } from '@docs/components/auth-block-tabs';\nimport { Callout } from '@docs/components/callout';\n\n<ExternalLinks links={[{ title: 'Clerk docs', url: 'https://go.clerk.com/Q1MKAz0' }]} />\n\n<div className=\"h-5\" />\n\n<div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n  ## Preview\n</div>\n    \n<BlockPreviewCard preview={<div className=\"w-full max-w-sm px-8\"><SocialConnections /></div>} />\n\n\n## Installation\n\n<AuthBlockTabs>\n  <AuthBlockTabsCliContent integration=\"none\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"social-connections\"]}/>\n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `SocialConnections` in your app.\n\n        ```tsx\n        import { SocialConnections } from '@/components/social-connections';\n        import { View } from 'react-native';\n\n        export default function SocialConnectionsScreen() {\n          return (\n            <View className='flex-1 items-center justify-center p-8'>\n              <View className=\"w-full max-w-sm\">\n                <SocialConnections />\n              </View>\n            </View>\n          );\n        }\n        ```\n\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n  <AuthBlockTabsCliContent integration=\"clerk\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"social-connections-clerk\"]}/>\n      </Step>\n      <Step>\n        **If you haven't already**\n\n        Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `SocialConnections` in your app.\n\n        ```tsx\n        import { SocialConnections } from '@/components/social-connections';\n        import { View } from 'react-native';\n\n        export default function SocialConnectionsScreen() {\n          return (\n            <View className='flex-1 items-center justify-center p-8'>\n              <View className=\"w-full max-w-sm\">\n                <SocialConnections />\n              </View>\n            </View>\n          );\n        }\n        ```\n\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n\n  <AuthBlockTabsManualContent integration=\"none\">\n\n    <Steps>\n      <Step>\n        **If missing, add the following component:**\n\n        - [`Button`](/docs/components/button)\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/social-connections.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/social-connections.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n\n  </AuthBlockTabsManualContent>\n  <AuthBlockTabsManualContent integration=\"clerk\">\n\n    <Steps>\n      <Step>\n\n        **Install the following dependencies:**\n\n        ```bash\n        npx expo install expo-auth-session expo-web-browser\n        ```\n\n      </Step>\n      <Step>\n        **If you haven't already**\n\n        - Install the Clerk package:\n\n        ```bash\n        npx expo install @clerk/clerk-expo\n        ```\n\n        - Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n\n      <Step>\n        **If missing, add the following component:**\n\n        - [`Button`](/docs/components/button)\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/clerk/social-connections.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/social-connections.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n    \n  </AuthBlockTabsManualContent>\n</AuthBlockTabs>"
  },
  {
    "path": "apps/docs/content/docs/blocks/authentication/user-menu.mdx",
    "content": "---\ntitle: User menu\ndescription: A popover menu presenting options and actions for the current user.\n---\n\nimport { BlockPreviewCard } from '@docs/components/preview-card';\nimport { UserMenu } from \"@docs/components/blocks\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';                                                                               \nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { AuthBlockTabs, AuthBlockTabsCliContent, AuthBlockTabsManualContent } from '@docs/components/auth-block-tabs';\nimport { Callout } from '@docs/components/callout';\n\n<ExternalLinks links={[{ title: 'Clerk docs', url: 'https://go.clerk.com/Q1MKAz0' }]} />\n\n<div className=\"h-5\" />\n\n<div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n  ## Preview\n</div>\n    \n<BlockPreviewCard preview={<UserMenu />} />\n\n\n## Installation\n\n<AuthBlockTabs>\n  <AuthBlockTabsCliContent integration=\"none\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"user-menu\"]}/>\n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `UserMenu` in your app.\n\n        ```tsx\n        import { UserMenu } from '@/components/user-menu';\n        import { View } from 'react-native';\n\n        export default function UserMenuScreen() {\n          return (\n            <View className='flex-1 items-center justify-center'>\n              <UserMenu />\n            </View>\n          );\n        }\n        ```\n\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n  <AuthBlockTabsCliContent integration=\"clerk\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"user-menu-clerk\"]}/>\n      </Step>\n      <Step>\n        **If you haven't already**\n\n        Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `UserMenu` in your app.\n\n        ```tsx\n        import { UserMenu } from '@/components/user-menu';\n        import { View } from 'react-native';\n\n        export default function UserMenuScreen() {\n          return (\n            <View className='flex-1 items-center justify-center'>\n              <UserMenu />\n            </View>\n          );\n        }\n        ```\n\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n\n  <AuthBlockTabsManualContent integration=\"none\">\n\n    <Steps>\n      <Step>\n        **If missing, add the following components:**\n\n        - [`Avatar`](/docs/components/avatar)\n        - [`Button`](/docs/components/button)\n        - [`Popover`](/docs/components/popover)\n        - [`Text`](/docs/components/text)\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/user-menu.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/user-menu.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n\n  </AuthBlockTabsManualContent>\n  <AuthBlockTabsManualContent integration=\"clerk\">\n\n    <Steps>\n      <Step>\n        **If you haven't already**\n\n        - Install the Clerk package:\n\n        ```bash\n        npx expo install @clerk/clerk-expo\n        ```\n\n        - Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n\n      <Step>\n        **If missing, add the following components:**\n\n        - [`Avatar`](/docs/components/avatar)\n        - [`Button`](/docs/components/button)\n        - [`Popover`](/docs/components/popover)\n        - [`Text`](/docs/components/text)\n\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/clerk/user-menu.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/user-menu.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n    \n  </AuthBlockTabsManualContent>\n</AuthBlockTabs>"
  },
  {
    "path": "apps/docs/content/docs/blocks/authentication/verify-email-form.mdx",
    "content": "---\ntitle: Verify email form\ndescription: A form for verifying an email address with an OTP sent via email.\n---\n\nimport { BlockPreviewCard } from '@docs/components/preview-card';\nimport { VerifyEmailForm } from \"@docs/components/blocks\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';                                                                                 \nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { AuthBlockTabs, AuthBlockTabsCliContent, AuthBlockTabsManualContent } from '@docs/components/auth-block-tabs';\nimport { Callout } from '@docs/components/callout';\n\n<ExternalLinks links={[{ title: 'Clerk docs', url: 'https://go.clerk.com/Q1MKAz0' }]} />\n\n<div className=\"h-5\" />\n\n<div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n  ## Preview\n</div>\n    \n<BlockPreviewCard preview={<div className=\"w-full max-w-sm\"><VerifyEmailForm /></div>} />\n\n\n## Installation\n\n<AuthBlockTabs>\n  <AuthBlockTabsCliContent integration=\"none\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"verify-email-form\"]}/>\n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `VerifyEmailForm` in your app.\n\n        ```tsx\n        import { VerifyEmailForm } from '@/components/verify-email-form';\n        import { ScrollView, View } from 'react-native';\n\n        export default function VerifyEmailScreen() {\n          return (\n            <ScrollView\n              keyboardShouldPersistTaps=\"handled\"\n              contentContainerClassName=\"sm:flex-1 items-center justify-center p-4 py-8 sm:py-4 sm:p-6 mt-safe\"\n              keyboardDismissMode=\"interactive\">\n              <View className=\"w-full max-w-sm\">\n                <VerifyEmailForm />\n              </View>\n            </ScrollView>\n          );\n        }\n        ``` \n\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n  <AuthBlockTabsCliContent integration=\"clerk\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"verify-email-form-clerk\"]}/>\n      </Step>\n      <Step>\n        **If you haven't already**\n\n        Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n      <Step>\n        **All set!**\n\n        You can import `VerifyEmailForm` in your app.\n\n        ```tsx\n        import { VerifyEmailForm } from '@/components/verify-email-form';\n        import { ScrollView, View } from 'react-native';\n\n        export default function VerifyEmailScreen() {\n          return (\n            <ScrollView\n              keyboardShouldPersistTaps=\"handled\"\n              contentContainerClassName=\"sm:flex-1 items-center justify-center p-4 py-8 sm:py-4 sm:p-6 mt-safe\"\n              keyboardDismissMode=\"interactive\">\n              <View className=\"w-full max-w-sm\">\n                <VerifyEmailForm />\n              </View>\n            </ScrollView>\n          );\n        }\n        ```\n\n      </Step>\n    </Steps>\n  </AuthBlockTabsCliContent>\n\n  <AuthBlockTabsManualContent integration=\"none\">\n\n    <Steps>\n      <Step>\n        **If missing, add the following components:**\n\n        - [`Button`](/docs/components/button)\n        - [`Card`](/docs/components/card)\n        - [`Input`](/docs/components/input)\n        - [`Label`](/docs/components/label)\n        - [`Text`](/docs/components/text)\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/verify-email-form.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/verify-email-form.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n\n  </AuthBlockTabsManualContent>\n  <AuthBlockTabsManualContent integration=\"clerk\">\n\n    <Steps>\n      <Step>\n        **If you haven't already**\n\n        - Install the Clerk package:\n\n        ```bash\n        npx expo install @clerk/clerk-expo\n        ```\n\n        - Follow steps 2-4 of Clerk's [Expo quick start](https://go.clerk.com/8e6CCee#set-your-clerk-api-keys) to configure your app for Clerk.\n        \n      </Step>\n\n      <Step>\n        **If missing, add the following components:**\n\n        - [`Button`](/docs/components/button)\n        - [`Card`](/docs/components/card)\n        - [`Input`](/docs/components/input)\n        - [`Label`](/docs/components/label)\n        - [`Text`](/docs/components/text)\n\n\n      </Step>\n\n      <Step>\n\n        **Copy and paste the following code into your project.**\n\n        ```json doc-gen:file\n        {\n          \"file\": \"./node_modules/@rnr/registry/src/blocks/clerk/verify-email-form.tsx\",\n          \"codeblock\": {\n            \"lang\": \"tsx\",\n            \"meta\": \"title=\\\"@/components/verify-email-form.tsx\\\"\"\n          }\n        }\n        ```\n\n      </Step>\n      \n      <Step>\n\n        **Adjust for your project setup.**\n\n        Update the import paths to match your project structure, and address any `// TODO:` comments by adding the app-specific logic they describe.\n\n      </Step>\n    </Steps>\n    \n  </AuthBlockTabsManualContent>\n</AuthBlockTabs>"
  },
  {
    "path": "apps/docs/content/docs/changelog.mdx",
    "content": "---\ntitle: Changelog\ndescription: Latest updates and announcements.\n---\n\nimport { Callout } from '@docs/components/callout';\nimport { CommandTabs } from '@docs/components/command-tabs';\nimport { VercelOssBadge } from '@docs/components/vercel-oss-badge';\nimport { ClerkLogo } from '@docs/components/clerk-logo';\nimport { DownloadAppBanner } from '@docs/components/download-app-banner';\n\n## December 2025 - Uniwind Integration\n\nReact Native Reusables now has full support for [Uniwind](https://uniwind.dev).\n\n### New Uniwind Template [#december-2025-uniwind-template]\n\nYou can now start new projects with Uniwind using the minimal-uniwind template:\n\n<CommandTabs args={[\"init\", \"-t\", \"minimal-uniwind\"]} />\n\n### Manual Installation Choice [#december-2025-manual-installation]\n\nWhen selecting \"Manual\" in the installation, you can now choose between Nativewind and Uniwind for your styling solution.\n\n### Automatic Uniwind Detection [#december-2025-uniwind-detection]\n\nWhen using the `add` command, the CLI will automatically add the Uniwind version of components when it detects a `uniwind-types.d.ts` file in your project.\n\n<CommandTabs args={[\"add\", \"[...components]\"]} />\n\n## August 2025 - Total Rewrite\n\nNew CLI. New docs. New registry. New showcase app. New sponsors.\n\n\n### Now part of the Vercel OSS Program [#august-2025-vercel-oss]\n\n<VercelOssBadge />\n\nReact Native Reusables is now part of the [Vercel OSS Program](https://vercel.com/oss), which supports its continued growth and development.\n\n### Sponsored Blocks by Clerk [#august-2025-clerk]\n\n<a href=\"https://go.clerk.com/gjgxNgT\" target=\"_blank\" className=\"block w-fit\">\n  <ClerkLogo />\n</a>\n\nReact Native Reusables now features a [template](https://github.com/founded-labs/react-native-reusables-templates/tree/main/clerk-auth) and sponsored [blocks](/docs/blocks/authentication) from [Clerk](https://go.clerk.com/gjgxNgT), helping you quickly integrate authentication into your apps with React Native Reusables.\n\n\n### First React Native shadcn registry _(probably)_ [#august-2025-first-react-native-shadcn-registry]\n\nYou can now use `npx shadcn@latest` with our registries.\n\nReact Native Reusables now follows the shadcn/ui **new-york** style, providing a consistent and familiar design system for your apps.\n\nTo make the experience even smoother, we built a thin wrapper around the CLI.\n\n- No need to copy long registry URLs\n\n- You can use `--all` to install everything at once\n\n- If you skip the component name, you'll get a multi-select prompt\n\n\n<CommandTabs args={[\"add\"]} />\n\n<span className=\"text-sm\">For more details, see the [add options](/docs/cli#add).</span> \n\nSame power, tailored for React Native Reusables.\n\n### Standardize rem to match web [#august-2025-standardize-rem]\n\nIn the `metro.config.js`, `inlineRem` is now set to `16` to match web sizing.\n\n```diff title=\"metro.config.js\"\nconst { getDefaultConfig } = require('expo/metro-config');\nconst { withNativeWind } = require('nativewind/metro');\n\nconst config = getDefaultConfig(__dirname);\n\n- module.exports = withNativeWind(config, { input: './global.css' });\n+ module.exports = withNativeWind(config, { input: './global.css', inlineRem: 16 });\n```\n\n### Enhanced iOS portal rendering with FullWindowOverlay [#august-2025-fullwindowoverlay-ios]\n\nAll portal content on iOS is now wrapped with `FullWindowOverlay` from `react-native-screens` to improve rendering and ensure seamless integration with native navigation.\n\n### New CLI - rewritten with Effect + shadcn [#august-2025-new-cli-rewritten-with-effect-shadcn]\n\nThe CLI has been rebuilt from the ground up with [`effect`](https://effect.website) and the [`shadcn`](https://ui.shadcn.com/docs/cli) engine under the hood for the add command.\n\nFeatures:\n\n- `doctor` command to diagnose and fix certain config/setup issues\n\n- Registry-aware component scaffolding\n\n- Stronger foundation for future updates\n\n<CommandTabs args={[\"doctor\"]} />\n\n<span className=\"text-sm\">For more details, see the [doctor command](/docs/cli#doctor).</span> \n\n### Improved component architecture [#august-2025-improved-component-architecture]\n\nEvery component has been refined and standardized.\n\n- Improved platform-specific logic\n\n- Easier to override and customize\n\n\n### Blocks [#august-2025-blocks]\n\nIntroduced authentication [blocks](/docs/blocks/authentication) to help you quickly integrate authentication into your apps with React Native Reusables.\n\n### Showcase App [#august-2025-showcase-app]\n\n<DownloadAppBanner />\n\n### Redesigned Docs [#august-2025-redesigned-docs]\n\nThe docs have been redesigned to be more consistent and easier to use.\n\n### New GitHub Home [#august-2025-new-github-home]\n\nWe moved the repo from my personal account to a dedicated org [@founded-labs](https://github.com/founded-labs).\n\nThis gives the project a long-term home with more room to grow.\n\n### New Icon component [#august-2025-new-icon-component]\n\nA single icon component to replace all icons from the deprecated `/lib/icons` directory.\n\n**Install the new icon component with the CLI**\n\n<CommandTabs args={[\"add\", \"icon\"]} />\n\n\n```tsx\n// Example usage\nimport { Icon } from '@/components/ui/icon';\nimport { HeartIcon } from 'lucide-react-native';\n\n<Icon as={HeartIcon} className=\"size-4 text-red-500\" />\n\n```\n\n### Text variants [#august-2025-text-variants]\n\nThe `Text` component now includes built-in typography variants, so you no longer need to use the deprecated `Typography` components like `<Typography.H1>`.\n\nUse the variant prop like this:\n\n```tsx\n<Text variant=\"h1\">Title</Text>\n```\n\nAvailable variants: `default`, `h1` , `h2`, `h3`, `h4`, `p`, `block-quote`, `code`, `lead`, `large`, `small`, and `muted`.\n\n### Deprecated [#august-2025-deprecated]\n\n- `lib/constants.ts`: now using the [`theme.ts`](/docs/customization#themets) file.\n\n- `lib/useColorScheme.ts`: now using the hook directly from [`nativewind`](https://www.nativewind.dev/docs/api/use-color-scheme)\n\n- `lib/icons`: deprecated in favor of the new [`Icon`](#august-2025-new-icon-component) component.\n\n- `components/ui/typography.tsx`: deprecated in favor of the new [`variant`](#august-2025-text-variants) prop on the `Text` component.\n\n### Upgrade Notes [#august-2025-upgrade-notes]\n1. Run the `doctor` command to diagnose. Then, follow the instructions to get your project up to date:\n\n<CommandTabs args={[\"doctor\"]} />\n\n2. Update your components by running the `add` command with `--overwrite` and list the components from your project:\n\n<Callout type=\"warn\">\n  Make sure you commit your changes before running the add command and use the diff view to see what's changed and to keep\n  your own custom changes.\n</Callout>\n\n<CommandTabs args={[\"add\", \"--overwrite\", \"[...components]\"]} />\n\n<span className='sr-only'>\n\n#### Thank you [#august-2025-thanks]\n\n</span>\n\n<br />\n\nThank you to everyone who has been using React Native Reusables, sharing feedback, and contributing.\nYour support means a lot and is truly appreciated."
  },
  {
    "path": "apps/docs/content/docs/cli.mdx",
    "content": "---\ntitle: CLI\ndescription: Use the CLI to add components and more\n---\n\nimport { Callout } from '@docs/components/callout';\nimport { CommandTabs } from '@docs/components/command-tabs';\n\n## init\n\nUse `init` to scaffold a new Expo project using a template.\n\n<CommandTabs args={[\"init\"]} />\n\n### Options\n\n```bash\nUsage: react-native-reusables init [options]\n\nInitialize a new Expo project with React Native Reusables\n\nOptions:\n  -c, --cwd <cwd>               the working directory. defaults to the current directory.\n  -t, --template <template>     the template to use.\n  -h, --help                    display help for command\n```\n\n<Callout title=\"Available templates\">\n\n- [minimal](https://github.com/founded-labs/react-native-reusables-templates/tree/main/minimal#minimal-template)\n- [minimal-uniwind](https://github.com/founded-labs/react-native-reusables-templates/tree/main/minimal-uniwind#minimal-uniwind-template)\n- [clerk-auth](https://github.com/founded-labs/react-native-reusables-templates/tree/main/clerk-auth#clerk-auth-template)\n\n</Callout>\n\n## add\n\n\nUse `add` to add React Native Reusables components to your project.\n\n<CommandTabs args={[\"add\", \"[components]\"]} />\n\n\n### Options\n\n```bash\nUsage: react-native-reusables add [options] [...components]\n\nAdd React Native Reusables components to your project\n\nArguments:\n  components         name of components to add\n\nOptions:\n  -c,  --cwd <cwd>    the working directory. defaults to the current directory.\n  --styling-library   override detected styling library (`nativewind` or `uniwind`)\n  -y,  --yes          skip confirmation prompt\n  -o,  --overwrite    force overwrite of existing files\n  -a,  --all          add all components\n  -p   --path <path>  path to the component\n  -h,  --help         display help for command\n```\n\n<Callout type=\"info\">\n  Uses the [shadcn](https://ui.shadcn.com/docs/cli#add) CLI under the hood.\n</Callout>\n\n\n## doctor\n\nUse `doctor` to check if everything is set up correctly.\n\n<CommandTabs args={[\"doctor\"]} />\n\n### Options\n\n```bash\nUsage: react-native-reusables doctor [options]\n\nCheck your project setup and diagnose issues\n\nOptions:\n  -c, --cwd <cwd>        the working directory. defaults to the current directory.\n  -s, --summary          show summary only\n  -y, --yes              skip confirmation prompt\n  -h, --help             display help for command\n```\n\n<div className=\"h-2\" />\n\n<Callout type=\"info\" title=\"Debugging\">\n\n    If you're having issues, you can run any command with the initial `--log-level all` flag to get more information and create a [bug report](https://github.com/founded-labs/react-native-reusables/issues).\n\n    <CommandTabs args={[\"--log-level all\", \"[command]\", \"[options]\", \"[...args]\"]} />\n\n</Callout>"
  },
  {
    "path": "apps/docs/content/docs/components/accordion.mdx",
    "content": "---\ntitle: Accordion\ndescription: A vertically stacked set of interactive headings that each reveal a section of content.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { AccordionPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';                \nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/accordion/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/accordion/#props' },\n  ]}\n/>\n \n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<AccordionPreview />}  />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/accordion.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    } \n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n    <Steps>\n      <Step>\n        <CommandTabs args={[\"add\", \"accordion\"]}/>\n      </Step>\n      <Step>\n\n        **Update `tailwind.config.js`**\n\n        Add the following animations to your tailwind.config.js file:\n\n        ```js title=\"tailwind.config.js\"\n        /** @type {import('tailwindcss').Config} */\n        module.exports = {\n          theme: {\n            extend: {\n              keyframes: {\n                'accordion-down': {\n                  from: { height: '0' },\n                  to: { height: 'var(--radix-accordion-content-height)' },\n                },\n                'accordion-up': {\n                  from: { height: 'var(--radix-accordion-content-height)' },\n                  to: { height: '0' },\n                },\n              },\n              animation: {\n                'accordion-down': 'accordion-down 0.2s ease-out',\n                'accordion-up': 'accordion-up 0.2s ease-out',\n              },\n            },\n          },\n        }\n        ```\n\n      </Step>\n    </Steps>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps>\n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/accordion\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/accordion.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/accordion.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/accordion.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/accordion.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n        \n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n      <Step>\n\n        **Update `tailwind.config.js`**\n\n        Add the following animations to your tailwind.config.js file:\n\n        ```js title=\"tailwind.config.js\"\n        /** @type {import('tailwindcss').Config} */\n        module.exports = {\n          theme: {\n            extend: {\n              keyframes: {\n                'accordion-down': {\n                  from: { height: '0' },\n                  to: { height: 'var(--radix-accordion-content-height)' },\n                },\n                'accordion-up': {\n                  from: { height: 'var(--radix-accordion-content-height)' },\n                  to: { height: '0' },\n                },\n              },\n              animation: {\n                'accordion-down': 'accordion-down 0.2s ease-out',\n                'accordion-up': 'accordion-up 0.2s ease-out',\n              },\n            },\n          },\n        }\n        ```\n\n      </Step>\n    </Steps>\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport {\n  Accordion,\n  AccordionContent,\n  AccordionItem,\n  AccordionTrigger,\n} from '@/components/ui/accordion';\nimport { Text } from '@/components/ui/text';\n```\n\n```tsx\n<Accordion type='single' collapsible>\n  <AccordionItem value='item-1'>\n    <AccordionTrigger>\n      <Text>Is it accessible?</Text>\n    </AccordionTrigger>\n    <AccordionContent>\n      <Text>Yes. It adheres to the WAI-ARIA design pattern.</Text>\n    </AccordionContent>\n  </AccordionItem>\n</Accordion>\n```\n"
  },
  {
    "path": "apps/docs/content/docs/components/alert-dialog.mdx",
    "content": "---\ntitle: Alert Dialog\ndescription: A modal dialog that interrupts the user with important content and expects a response.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PortalInfoAlert } from '@docs/components/portal-info-alert';\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { AlertDialogPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/alert-dialog/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/alert-dialog/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<AlertDialogPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/alert-dialog.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    } \n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n    <CommandTabs args={[\"add\", \"alert-dialog\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps>\n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/alert-dialog\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/button.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/button.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/native-only-animated-view.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/native-only-animated-view.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/alert-dialog.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/alert-dialog.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/button.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/button.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/native-only-animated-view.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/native-only-animated-view.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/alert-dialog.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/alert-dialog.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n<PortalInfoAlert/>\n\n```tsx\nimport {\n  AlertDialog,\n  AlertDialogAction,\n  AlertDialogCancel,\n  AlertDialogContent,\n  AlertDialogDescription,\n  AlertDialogFooter,\n  AlertDialogHeader,\n  AlertDialogTitle,\n  AlertDialogTrigger,\n} from '@/components/ui/alert-dialog';\nimport { Text } from '@/components/ui/text';\n```\n\n```tsx\n<AlertDialog>\n  <AlertDialogTrigger>\n    <Text>Show Alert Dialog</Text>\n  </AlertDialogTrigger>\n  <AlertDialogContent>\n    <AlertDialogHeader>\n      <AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle>\n      <AlertDialogDescription>\n        This action cannot be undone. This will permanently delete your account and remove\n        your data from our servers.\n      </AlertDialogDescription>\n    </AlertDialogHeader>\n    <AlertDialogFooter>\n      <AlertDialogCancel>\n        <Text>Cancel</Text>\n      </AlertDialogCancel>\n      <AlertDialogAction>\n        <Text>Continue</Text>\n      </AlertDialogAction>\n    </AlertDialogFooter>\n  </AlertDialogContent>\n</AlertDialog>\n```\n"
  },
  {
    "path": "apps/docs/content/docs/components/alert.mdx",
    "content": "---\ntitle: Alert\ndescription: Displays a callout for user attention.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { AlertPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<AlertPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/alert.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"alert\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/alert.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/alert.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/alert.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/alert.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';\nimport { Terminal } from '@/lib/icons/Terminal';\n```\n\n```tsx\n<Alert icon={Terminal}>\n  <AlertTitle>Heads up!</AlertTitle>\n  <AlertDescription>\n    You can use a terminal to run commands on your computer.\n  </AlertDescription>\n</Alert>\n```"
  },
  {
    "path": "apps/docs/content/docs/components/aspect-ratio.mdx",
    "content": "---\ntitle: Aspect Ratio\ndescription: Displays content within a desired ratio.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { AspectRatioPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/aspect-ratio/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/aspect-ratio/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div> \n    <PreviewCard preview={<AspectRatioPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/aspect-ratio.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"aspect-ratio\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/aspect-ratio\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/aspect-ratio.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/aspect-ratio.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/aspect-ratio.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/aspect-ratio.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { AspectRatio } from '@/components/ui/aspect-ratio';\nimport { Text } from '@/components/ui/text';\n```\n\n```tsx\n<AspectRatio ratio={16 / 9} className='h-full w-full justify-center items-center'>\n  <Text>16:9</Text>\n</AspectRatio>\n```"
  },
  {
    "path": "apps/docs/content/docs/components/avatar.mdx",
    "content": "---\ntitle: Avatar\ndescription: An image element with a fallback for representing the user.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { AvatarPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/avatar/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/avatar/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div> \n    <PreviewCard preview={<AvatarPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/avatar.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"avatar\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/avatar\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/avatar.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/avatar.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/avatar.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/avatar.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';\nimport { Text } from '@/components/ui/text';\n\n```\n\n```tsx\n<Avatar alt=\"Zach Nugent's Avatar\">\n  <AvatarImage source={{ uri: 'https://github.com/mrzachnugent.png' }} />\n  <AvatarFallback>\n    <Text>ZN</Text>\n  </AvatarFallback>\n</Avatar>\n```\n"
  },
  {
    "path": "apps/docs/content/docs/components/badge.mdx",
    "content": "---\ntitle: Badge\ndescription: Displays a badge or a component that looks like a badge.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { BadgePreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div> \n    <PreviewCard preview={<BadgePreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/badge.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"badge\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n       **Install the following dependencies:**\n\n        ```\n        npx expo install @rn-primitives/slot\n        ```\n\n      </Step>\n      <Step>\n \n       **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/badge.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/badge.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/badge.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/badge.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n \n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Badge } from '@/components/ui/badge';\nimport { Text } from '@/components/ui/text';\n\n```\n\n```tsx\n<Badge>\n  <Text>Badge</Text>\n</Badge>\n```\n\n#### Link\n\nYou can use the `badgeVariants` and `badgeTextVariants` helpers to create a link that looks like a badge.\n\n```tsx\nimport { badgeVariants, badgeTextVariants } from \"@/components/ui/badge\"\n```\n\n```tsx\n<Link className={badgeVariants({ variant: 'outline' })}>\n  <Text className={badgeTextVariants({ variant: 'outline' })}>Badge</Text>\n</Link>\n```"
  },
  {
    "path": "apps/docs/content/docs/components/button.mdx",
    "content": "---\ntitle: Button\ndescription: Displays a button or a component that looks like a button.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { ButtonPreview, ButtonDestructivePreview, ButtonOutlinePreview, ButtonSecondaryPreview, ButtonGhostPreview, ButtonLinkPreview, ButtonIconPreview, ButtonWithIconPreview, ButtonLoadingPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<ButtonPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/button/button-primary.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"button\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependencies:**\n\n        ```\n        npx expo install @rn-primitives/slot\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/button.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/button.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/button.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/button.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Button } from '@/components/ui/button';\nimport { Text } from '@/components/ui/text';\n\n```\n\n```tsx\n<Button>\n  <Text>Button</Text>\n</Button>\n```\n\n#### Link\n\nYou can use the `buttonVariants` and `buttonTextVariants` helpers to create a link that looks like a button.\n\n```tsx\nimport { buttonVariants, buttonTextVariants } from \"@/components/ui/button\"\n```\n\n```tsx\n<Link className={buttonVariants({ variant: 'outline' })}>\n  <Text className={buttonTextVariants({ variant: 'outline' })}>Click here</Text>\n</Link>\n```\n\nAlternatively, you can set the `asChild` parameter and nest the link component.\n\n```tsx\n<Link href=\"/login\" asChild>\n  <Button>\n    <Text>Login</Text>\n  </Button>\n</Link>\n```\n\n### Examples\n\n#### Primary\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <PreviewCard preview={<ButtonPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/button/button-primary.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n<div className=\"h-5\"/>\n\n#### Secondary\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <PreviewCard preview={<ButtonSecondaryPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/button/button-secondary.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n<div className=\"h-5\"/>\n\n#### Destructive\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <PreviewCard preview={<ButtonDestructivePreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/button/button-destructive.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n<div className=\"h-5\"/>\n\n#### Outline\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <PreviewCard preview={<ButtonOutlinePreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/button/button-outline.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n<div className=\"h-5\"/>\n\n#### Ghost\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <PreviewCard preview={<ButtonGhostPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/button/button-ghost.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n<div className=\"h-5\"/>\n\n#### Link\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <PreviewCard preview={<ButtonLinkPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/button/button-link.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n<div className=\"h-5\"/>\n\n#### Icon\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <PreviewCard preview={<ButtonIconPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/button/button-icon.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n<div className=\"h-5\"/>\n\n#### With Icon\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <PreviewCard preview={<ButtonWithIconPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/button/button-with-icon.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n<div className=\"h-5\"/>\n\n#### Loading\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <PreviewCard preview={<ButtonLoadingPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/button/button-loading.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>"
  },
  {
    "path": "apps/docs/content/docs/components/card.mdx",
    "content": "---\ntitle: Card\ndescription: Displays a card with header, content, and footer.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { CardPreview, CardExample } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<CardPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/card.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"card\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/card.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/card.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/card.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/card.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n \n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from '@/components/ui/card';\nimport { Text } from '@/components/ui/text';\n\n```\n\n```tsx\n<Card>\n  <CardHeader>\n    <CardTitle>Card Title</CardTitle>\n    <CardDescription>Card Description</CardDescription>\n  </CardHeader>\n  <CardContent>\n    <Text>Card Content</Text>\n  </CardContent>\n  <CardFooter>\n    <Text>Card Footer</Text>\n  </CardFooter>\n</Card>\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/components/checkbox.mdx",
    "content": "---\ntitle: Checkbox\ndescription: A control that allows the user to toggle between checked and not checked.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { CheckboxPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/checkbox/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/checkbox/#props' },  \n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<CheckboxPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/checkbox.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"checkbox\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/checkbox\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/checkbox.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/checkbox.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/checkbox.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/checkbox.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Checkbox } from \"@/components/ui/checkbox\"\n\n```\n\n```tsx\n<Checkbox />\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/components/collapsible.mdx",
    "content": "---\ntitle: Collapsible\ndescription: A control that allows the user to toggle between checked and not checked.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { CollapsiblePreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/collapsible/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/collapsible/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<CollapsiblePreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/collapsible.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"collapsible\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/collapsible\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/collapsible.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/collapsible.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/collapsible.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/collapsible.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Collapsible } from \"@/components/ui/collapsible\"\nimport { Text } from \"@/components/ui/text\"\n\n```\n\n```tsx\n<Collapsible>\n  <CollapsibleTrigger>\n    <Text>Can I use this in my project?</Text>\n  </CollapsibleTrigger>\n  <CollapsibleContent>\n    <Text>Yes. Free to use for personal and commercial projects. No attribution required.</Text>\n  </CollapsibleContent>\n</Collapsible>\n```"
  },
  {
    "path": "apps/docs/content/docs/components/context-menu.mdx",
    "content": "---\ntitle: Context Menu\ndescription: Displays a menu to the user — such as a set of actions or functions — triggered by a button.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PortalInfoAlert } from '@docs/components/portal-info-alert';\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { ContextMenuPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/context-menu/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/context-menu/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<ContextMenuPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/context-menu.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"context-menu\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/context-menu\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/context-menu.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/context-menu.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/context-menu.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/context-menu.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n<PortalInfoAlert />\n\n```tsx\nimport {\n  ContextMenu,\n  ContextMenuContent,\n  ContextMenuItem,\n  ContextMenuTrigger,\n} from '@/components/ui/context-menu';\nimport { Text } from '@/components/ui/text';\n\n```\n\n```tsx\n<ContextMenu>\n  <ContextMenuTrigger>\n    <Text>Right click</Text>\n  </ContextMenuTrigger>\n  <ContextMenuContent>\n    <ContextMenuItem>\n      <Text>Profile</Text>\n    </ContextMenuItem>\n    <ContextMenuItem>\n      <Text>Billing</Text>\n    </ContextMenuItem>\n    <ContextMenuItem>\n      <Text>Team</Text>\n    </ContextMenuItem>\n    <ContextMenuItem>\n      <Text>Subscription</Text>\n    </ContextMenuItem>\n  </ContextMenuContent>\n</ContextMenu>\n```"
  },
  {
    "path": "apps/docs/content/docs/components/dialog.mdx",
    "content": "---\ntitle: Dialog\ndescription: A window overlaid on either the primary window or another dialog window, rendering the content underneath inert.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PortalInfoAlert } from '@docs/components/portal-info-alert';\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { DialogPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/dialog/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/dialog/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<DialogPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/dialog.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"dialog\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/dialog\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/native-only-animated-view.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/native-only-animated-view.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/dialog.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/dialog.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/dialog.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/dialog.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n \n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n<PortalInfoAlert />\n\n```tsx\nimport {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogHeader,\n  DialogTitle,\n  DialogTrigger,\n} from \"@/components/ui/dialog\"\n```\n\n```tsx\n<Dialog>\n  <DialogTrigger>\n    <Text>Open</Text>\n  </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 account and remove your data\n        from our servers.\n      </DialogDescription>\n    </DialogHeader>\n  </DialogContent>\n</Dialog>\n```\n"
  },
  {
    "path": "apps/docs/content/docs/components/dropdown-menu.mdx",
    "content": "---\ntitle: Dropdown Menu\ndescription: Displays a menu to the user — such as a set of actions or functions — triggered by a button.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PortalInfoAlert } from '@docs/components/portal-info-alert';\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { DropdownMenuPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/dropdown-menu/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/dropdown-menu/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<DropdownMenuPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/dropdown-menu.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"dropdown-menu\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/dropdown-menu\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/dropdown-menu.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/dropdown-menu.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/dropdown-menu.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/dropdown-menu.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n<PortalInfoAlert />\n\n```tsx\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { Text } from '@/components/ui/text';\n\n```\n\n```tsx\n<DropdownMenu>\n  <DropdownMenuTrigger>\n    <Text>Open</Text>\n  </DropdownMenuTrigger>\n  <DropdownMenuContent>\n    <DropdownMenuLabel>\n      <Text>My Account</Text>\n    </DropdownMenuLabel>\n    <DropdownMenuSeparator />\n    <DropdownMenuItem>\n      <Text>Profile</Text>\n    </DropdownMenuItem>\n    <DropdownMenuItem>\n      <Text>Team</Text>\n    </DropdownMenuItem> \n  </DropdownMenuContent>\n</DropdownMenu>\n```\n"
  },
  {
    "path": "apps/docs/content/docs/components/hover-card.mdx",
    "content": "---\ntitle: Hover Card\ndescription: For sighted users to preview content available behind a link.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PortalInfoAlert } from '@docs/components/portal-info-alert';\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { HoverCardPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/hover-card/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/hover-card/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<HoverCardPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/hover-card.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"hover-card\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/hover-card\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/hover-card.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/hover-card.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/hover-card.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/hover-card.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n<PortalInfoAlert />\n\n```tsx\nimport {\n  HoverCard,\n  HoverCardContent,\n  HoverCardTrigger,\n} from \"@/components/ui/hover-card\"\nimport { Text } from '@/components/ui/text';\n\n```\n\n```tsx\n<HoverCard>\n  <HoverCardTrigger>\n    <Text>Hover</Text>\n  </HoverCardTrigger>\n  <HoverCardContent>\n    <Text>The React Framework – created and maintained by @vercel.</Text>\n  </HoverCardContent>\n</HoverCard>\n```"
  },
  {
    "path": "apps/docs/content/docs/components/input.mdx",
    "content": "---\ntitle: Input\ndescription: Displays a form input field or a component that looks like an input field.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { InputPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard\n      preview={\n        <div className='w-full max-w-80'>\n          <InputPreview />\n        </div>\n      }\n    />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/input.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n    <CommandTabs args={[\"add\", \"input\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/input.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/input.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/input.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/input.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Input } from \"@/components/ui/input\"\n```\n\n```tsx\n<Input />\n```\n"
  },
  {
    "path": "apps/docs/content/docs/components/label.mdx",
    "content": "---\ntitle: Label\ndescription: Renders an accessible label associated with controls.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { LabelPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard\n      preview={<LabelPreview />}\n    />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/label.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n    <CommandTabs args={[\"add\", \"label\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps>\n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/label\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/label.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/label.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/label.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/label.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Label } from \"@/components/ui/label\"\n```\n\n```tsx\n<Label htmlFor=\"email\" nativeID='email'>Your email address</Label>\n```\n"
  },
  {
    "path": "apps/docs/content/docs/components/menubar.mdx",
    "content": "---\ntitle: Menubar\ndescription: A visually persistent menu common in desktop applications that provides quick access to a consistent set of commands.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PortalInfoAlert } from '@docs/components/portal-info-alert';\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { MenubarPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/menubar/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/menubar/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<MenubarPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/menubar.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"menubar\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/menubar\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/menubar.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/menubar.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/menubar.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/menubar.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n<PortalInfoAlert />\n\n```tsx\nimport {\n  Menubar,\n  MenubarContent,\n  MenubarItem,\n  MenubarMenu,\n  MenubarSeparator,\n  MenubarShortcut,\n  MenubarTrigger,\n} from \"@/components/ui/menubar\"\nimport { Text } from '@/components/ui/text';\n\n```\n\n```tsx\n<Menubar>\n  <MenubarMenu>\n    <MenubarTrigger>\n      <Text>File</Text>\n    </MenubarTrigger>\n    <MenubarContent>\n      <MenubarItem>\n        <Text>New Tab</Text> <MenubarShortcut>⌘T</MenubarShortcut>\n      </MenubarItem>\n      <MenubarItem>\n        <Text>New Window</Text>\n      </MenubarItem>\n      <MenubarSeparator />\n      <MenubarItem>\n        <Text>Share</Text>\n      </MenubarItem>\n      <MenubarSeparator />\n      <MenubarItem>\n        <Text>Print</Text>\n      </MenubarItem>\n    </MenubarContent>\n  </MenubarMenu>\n</Menubar>\n```\n"
  },
  {
    "path": "apps/docs/content/docs/components/popover.mdx",
    "content": "---\ntitle: Popover\ndescription: Displays rich content in a portal, triggered by a button.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PortalInfoAlert } from '@docs/components/portal-info-alert';\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { PopoverPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/popover/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/popover/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<PopoverPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/popover.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"popover\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/popover\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/popover.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/popover.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/popover.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/popover.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n \n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n<PortalInfoAlert />\n\n```tsx\nimport {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from \"@/components/ui/popover\"\nimport { Text } from '@/components/ui/text';\n\n```\n\n```tsx\n<Popover>\n  <PopoverTrigger>\n    <Text>Open</Text>\n  </PopoverTrigger>\n  <PopoverContent>\n    <Text>Place content for the popover here.</Text>\n  </PopoverContent>\n</Popover>\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/components/progress.mdx",
    "content": "---\ntitle: Progress\ndescription: Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PortalInfoAlert } from '@docs/components/portal-info-alert';\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { ProgressPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/progress/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/progress/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<ProgressPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/progress.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"progress\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/progress\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/progress.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/progress.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/progress.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/progress.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Progress } from \"@/components/ui/progress\"\n```\n\n```tsx\n<Progress value={33} />\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/components/radio-group.mdx",
    "content": "---\ntitle: Radio Group\ndescription: A set of checkable buttons—known as radio buttons—where no more than one of the buttons can be checked at a time.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { RadioGroupPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/radio-group/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/radio-group/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<RadioGroupPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/radio-group.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"radio-group\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/radio-group\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/radio-group.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/radio-group.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/radio-group.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/radio-group.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { View } from \"react-native\"\nimport { RadioGroup, RadioGroupItem } from \"@/components/ui/radio-group\"\nimport { Label } from \"@/components/ui/label\"\n```\n\n```tsx\n<RadioGroup defaultValue=\"comfortable\">\n  <View className=\"flex flex-row items-center gap-3\">\n    <RadioGroupItem value=\"default\" id=\"r1\" />\n    <Label htmlFor=\"r1\">Default</Label>\n  </View>\n  <View className=\"flex flex-row items-center gap-3\">\n    <RadioGroupItem value=\"comfortable\" id=\"r2\" />\n    <Label htmlFor=\"r2\">Comfortable</Label>\n  </View>\n  <View className=\"flex flex-row items-center gap-3\">\n    <RadioGroupItem value=\"compact\" id=\"r3\" />\n    <Label htmlFor=\"r3\">Compact</Label>\n  </View>\n</RadioGroup>\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/components/select.mdx",
    "content": "---\ntitle: Select\ndescription: Displays a list of options for the user to pick from—triggered by a button.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PortalInfoAlert } from '@docs/components/portal-info-alert';\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { SelectPreview, ScrollableSelectPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\nimport { Callout } from '@docs/components/callout';\nimport Link from 'next/link';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/select/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/select/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<SelectPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/select/select.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"select\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/select\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n\n         ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/native-only-animated-view.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/native-only-animated-view.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/select.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/select.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/native-only-animated-view.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/native-only-animated-view.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/select.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/select.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n<PortalInfoAlert />\n\n```tsx\nimport {\n  Select,\n  SelectContent,\n  SelectGroup,\n  SelectItem,\n  SelectLabel,\n  SelectTrigger,\n  SelectValue,\n} from \"@/components/ui/select\"\n```\n\n```tsx\n <Select>\n  <SelectTrigger className='w-[180px]'>\n    <SelectValue placeholder='Select a fruit' />\n  </SelectTrigger>\n  <SelectContent insets={contentInsets} className='w-[180px]'>\n    <SelectGroup>\n      <SelectLabel>Fruits</SelectLabel>\n      <SelectItem label='Apple' value='apple'>\n        Apple\n      </SelectItem>\n      <SelectItem label='Banana' value='banana'>\n        Banana\n      </SelectItem>\n      <SelectItem label='Blueberry' value='blueberry'>\n        Blueberry\n      </SelectItem>\n    </SelectGroup>\n  </SelectContent>\n</Select>\n```\n\n### Example\n\n#### Scrollable\n\n<Callout type=\"warn\" title=\"React Native Gesture Handler Required\">\n  Install {' '}<Link target=\"_blank\" href=\"https://docs.swmansion.com/react-native-gesture-handler/docs/fundamentals/installation#setup\" className=\"hover:underline\"><code className=\"bg-muted rounded-sm px-1 py-0.5 text-[0.813rem]\">react-native-gesture-handler</code></Link>{' '}\n  to your project and add the following `NativeSelectScrollView` component to your `@/components/ui/select.tsx` file or the file using the scrollable select.\n</Callout>\n\n```tsx\nimport { ScrollView } from 'react-native-gesture-handler';\n/**\n * @platform Native only\n * Returns the children on the web\n */\nfunction NativeSelectScrollView({ className, ...props }: React.ComponentProps<typeof ScrollView>) {\n  if (Platform.OS === 'web') {\n    return <>{props.children}</>;\n  }\n  return <ScrollView className={cn('max-h-52', className)} {...props} />;\n}\n```\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <PreviewCard preview={<ScrollableSelectPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/select/scrollable-select.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n"
  },
  {
    "path": "apps/docs/content/docs/components/separator.mdx",
    "content": "---\ntitle: Separator\ndescription: Visually or semantically separates content.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { SeparatorPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/separator/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/separator/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<SeparatorPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/separator.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"separator\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/separator\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/separator.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/separator.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/separator.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/separator.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Separator } from \"@/components/ui/separator\"\n```\n\n```tsx\n<Separator />\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/components/skeleton.mdx",
    "content": "---\ntitle: Skeleton\ndescription: Use to show a placeholder while content is loading.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { SkeletonPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/skeleton/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/skeleton/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<SkeletonPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/skeleton.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"skeleton\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/skeleton.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/skeleton.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/skeleton.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/skeleton.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Skeleton } from \"@/components/ui/skeleton\"\n```\n\n```tsx\n<Skeleton className=\"h-[20px] w-[100px] rounded-full\" />\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/components/switch.mdx",
    "content": "---\ntitle: Switch\ndescription: A control that allows the user to toggle between checked and not checked.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { SwitchPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/switch/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/switch/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<SwitchPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/switch.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"switch\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/switch\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/switch.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/switch.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/switch.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/switch.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n \n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Switch } from \"@/components/ui/switch\"\n```\n\n```tsx\n<Switch />\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/components/tabs.mdx",
    "content": "---\ntitle: Tabs\ndescription: A set of layered sections of content—known as tab panels—that are displayed one at a time.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { TabsPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/tabs/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/tabs/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<TabsPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/tabs.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"tabs\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/tabs\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/tabs.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/tabs.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/tabs.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/tabs.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\"\nimport * as React from 'react';\n```\n\n```tsx\nconst [value, setValue] = React.useState('account');\n\nreturn (\n  <Tabs value={value} onValueChange={setValue} className=\"w-[400px]\">\n    <TabsList>\n      <TabsTrigger value=\"account\">Account</TabsTrigger>\n      <TabsTrigger value=\"password\">Password</TabsTrigger>\n    </TabsList>\n    <TabsContent value=\"account\">Make changes to your account here.</TabsContent>\n    <TabsContent value=\"password\">Change your password here.</TabsContent>\n  </Tabs>\n)\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/components/text.mdx",
    "content": "---\ntitle: Text\ndescription: A component for displaying text.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { TextPreview, TextTypographyPreview, TextCascadePreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<TextPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/text/text.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"text\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/slot\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n<div className=\"h-5\"/>\n\n### Inheritance system\n\nIn React Native, child components don't automatically get styles from their parent. This causes issues for things like buttons, where the text inside should change based on the button's style.\n\nTo fix this, we use something called `TextClassContext` to pass styles down. The parent (like a Button) wraps its content with this context, and the `Text` component uses the styles from it.\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <PreviewCard preview={<TextCascadePreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/text/text-cascade.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n<div className=\"h-5\"/>\n\n### Usage\n\n```tsx\nimport { Text } from \"@/components/ui/text\"\n```\n\n```tsx\n<Text>Hello, world!</Text>\n```\n<div className=\"h-5\"/>\n\n\n#### Typography\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <PreviewCard preview={<TextTypographyPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/text/text-typorgaphy.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>"
  },
  {
    "path": "apps/docs/content/docs/components/textarea.mdx",
    "content": "---\ntitle: Textarea\ndescription: Displays a form textarea or a component that looks like a textarea.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { TextareaPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<TextareaPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/textarea.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"textarea\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/textarea.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/textarea.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/textarea.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/textarea.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Textarea } from \"@/components/ui/textarea\"\n```\n\n```tsx\n  <Textarea placeholder=\"Type your message here.\" />\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/components/toggle-group.mdx",
    "content": "---\ntitle: Toggle Group\ndescription: A set of two-state buttons that can be toggled on or off.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { ToggleGroupPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[  \n    { title: 'Docs', url: 'https://rnprimitives.com/toggle-group/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/toggle-group/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<ToggleGroupPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/toggle-group.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"toggle-group\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/toggle-group\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/toggle.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/toggle.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/toggle-group.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/toggle-group.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/toggle.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/toggle.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/toggle-group.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/toggle-group.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Bold, Italic, Underline } from 'lucide-react-native';\nimport { ToggleGroup, ToggleGroupIcon, ToggleGroupItem } from '@/components/ui/toggle-group';\nimport * as React from 'react';\n```\n\n```tsx\n  const [value, setValue] = React.useState<string[]>([]);\n  return (\n    <ToggleGroup value={value} onValueChange={setValue} variant='outline' type='multiple'>\n      <ToggleGroupItem isFirst value='bold' aria-label='Toggle bold'>\n        <ToggleGroupIcon as={Bold} />\n      </ToggleGroupItem>\n      <ToggleGroupItem value='italic' aria-label='Toggle italic'>\n        <ToggleGroupIcon as={Italic} />\n      </ToggleGroupItem>\n      <ToggleGroupItem isLast value='strikethrough' aria-label='Toggle strikethrough'>\n        <ToggleGroupIcon as={Underline} />\n      </ToggleGroupItem>\n    </ToggleGroup>\n  );\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/components/toggle.mdx",
    "content": "---\ntitle: Toggle\ndescription: A two-state button that can be either on or off.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { TogglePreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/toggle/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/toggle/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<TogglePreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/toggle.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"toggle\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/toggle\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/toggle.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/toggle.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/icon.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/icon.tsx\\\"\"\n            }\n          }\n          ```\n          \n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/toggle.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/toggle.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n```tsx\nimport { Toggle } from \"@/components/ui/toggle\"\n```\n\n```tsx\nconst [pressed, setPressed] = React.useState(false);\n\nreturn (\n  <Toggle pressed={pressed} onPressedChange={setPressed} />\n)\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/components/tooltip.mdx",
    "content": "---\ntitle: Tooltip\ndescription: A popup that displays information related to an element when the element receives keyboard focus, the mouse hovers over it, or when it is pressed.\n---\n\nimport { CommandTabs } from \"@docs/components/command-tabs\";\nimport { ExternalLinks } from \"@docs/components/external-links\";\nimport { PreviewCard } from \"@docs/components/preview-card\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@docs/components/ui/tabs\";\nimport { TooltipPreview } from \"@docs/components/examples\";\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { PortalInfoAlert } from '@docs/components/portal-info-alert';\nimport { StylingLibraryTabs, StylingLibraryTabsNativewindContent, StylingLibraryTabsUnwindContent } from '@docs/components/styling-library-tabs';\n\n<ExternalLinks\n  links={[\n    { title: 'Docs', url: 'https://rnprimitives.com/tooltip/' },\n    { title: 'API Reference', url: 'https://rnprimitives.com/tooltip/#props' },\n  ]}\n/>\n\n<div className=\"h-5\"/>\n\n<Tabs defaultValue=\"preview\">\n  <TabsList>\n    <TabsTrigger value=\"preview\">Preview</TabsTrigger>\n    <TabsTrigger value=\"code\">Code</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"preview\">\n    <div id=\"preview\" className='*:hidden scroll-m-20' aria-hidden>\n      ## Preview\n    </div>\n    <PreviewCard preview={<TooltipPreview />} />\n  </TabsContent>\n  <TabsContent value=\"code\">\n    ```json doc-gen:file\n    {\n      \"file\": \"./node_modules/@rnr/registry/src/examples/tooltip.tsx\",\n      \"codeblock\": {\n        \"lang\": \"tsx\"\n      }\n    }\n    ```\n  </TabsContent>\n</Tabs>\n\n\n## Installation\n\n<Tabs defaultValue=\"cli\">\n  <TabsList>\n    <TabsTrigger id=\"cli\" value=\"cli\">CLI</TabsTrigger>\n    <TabsTrigger id=\"manual\" value=\"manual\">Manual</TabsTrigger>\n  </TabsList>\n  <TabsContent value=\"cli\">\n     <CommandTabs args={[\"add\", \"tooltip\"]}/>\n  </TabsContent>\n  <TabsContent value=\"manual\">\n    <Steps> \n      <Step>\n \n        **Install the following dependency:**\n\n        ```\n        npx expo install @rn-primitives/tooltip\n        ```\n\n      </Step>\n      <Step>\n \n        **Copy and paste the following code into your project.**\n\n        <StylingLibraryTabs>\n          <StylingLibraryTabsNativewindContent>\n            ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/tooltip.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/tooltip.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsNativewindContent>\n          \n          <StylingLibraryTabsUnwindContent>\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/text.tsx\\\"\"\n            }\n          }\n          ```\n\n          ```json doc-gen:file\n          {\n            \"file\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/tooltip.tsx\",\n            \"codeblock\": {\n              \"lang\": \"tsx\",\n              \"meta\": \"title=\\\"@/components/ui/tooltip.tsx\\\"\"\n            }\n          }\n          ```\n          </StylingLibraryTabsUnwindContent>\n        </StylingLibraryTabs>\n\n      </Step>\n      <Step>\n\n        **Update the import paths to match your project setup.**\n\n      </Step>\n    </Steps>\n\n  </TabsContent>\n</Tabs>\n\n### Usage\n\n<PortalInfoAlert />\n\n```tsx\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\"\nimport { Text } from \"@/components/ui/text\"\n```\n\n```tsx\n<Tooltip>\n  <TooltipTrigger><Text>Hover</Text></TooltipTrigger>\n  <TooltipContent>\n    <Text>Add to library</Text>\n  </TooltipContent>\n</Tooltip>\n```\n\n"
  },
  {
    "path": "apps/docs/content/docs/create-your-own-registry.mdx",
    "content": "---\ntitle: Create Your Own Registry\ndescription: Host a registry and allow others to add your code to their projects.\n---\n\nimport { Callout } from '@docs/components/callout';\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport Image from 'next/image';\nimport { CommandTabs } from '@docs/components/command-tabs';\n\n<figure className=\"flex flex-col\">\n  <Image\n    src=\"/images/registry-light.png\"\n    width=\"1432\"\n    height=\"960\"\n    alt=\"Registry\"\n    className=\"w-full overflow-hidden rounded-lg border dark:hidden\"\n  />\n  <Image\n    src=\"/images/registry-dark.png\"\n    width=\"1432\"\n    height=\"960\"\n    alt=\"Registry\"\n    className=\"hidden w-full overflow-hidden rounded-lg border shadow-sm dark:block\"\n  />\n  <figcaption className=\"text-center text-sm text-gray-500\">\n    A distribution system for code by shadcn\n  </figcaption>\n</figure>\n\n\n## Getting started\n\nTo create your own registry, follow the official shadcn/ui [registry guide](https://ui.shadcn.com/docs/registry).\n\n<Callout type=\"info\" title=\"Community template\">\n  Kickstart your React Native Reusables registry using the [rnr-registry-template](https://github.com/gabimoncha/rnr-registry-template) by [@gabimoncha](https://github.com/gabimoncha).\n</Callout>\n\n<div className=\"h-5\" />\n\n## Using React Native Reusables with your registry\n\nTo use React Native Reusables in your registry, add them as `registryDependencies` in your [`registry-item.json`](https://ui.shadcn.com/docs/registry/registry-item-json) files.\n\nInstead of using short names like in the shadcn/ui registry, use the full URL of the React Native Reusables registry item:\n\n```\nhttp://reactnativereusables.com/r/<STYLING_LIBRARY>/<COMPONENT_NAME>.json\n```\n\nReplace `<STYLING_LIBRARY>` with the styling library you want to use (either `uniwind` or `nativewind`) and `<COMPONENT_NAME>` with the component you want to install.\n\n<div className=\"h-5\" />\n\n## Using the CLI\n\nOnce your registry is up and running, you can install components using the `add` command and the full URL of the registry item.\n\nYou can use either `shadcn` or `@react-native-reusables/cli`.\n\n<CommandTabs args={[\"add\", \"http://localhost:3000/r/hello-world.json\"]} />\n"
  },
  {
    "path": "apps/docs/content/docs/customization.mdx",
    "content": "---\ntitle: Customization\ndescription: How to customize your project\n---\n\nReact Native Reusables uses a theme system based on Tailwind CSS v3 and shadcn/ui. There are four files involved:\n\n- `components.json` - used by the CLI to scaffold components with the correct paths and style  \n- `global.css` - defines your light and dark themes using CSS variables  \n- `tailwind.config.ts` - connects Tailwind classes to your CSS variables  \n- `theme.ts` - mirrors those variables in TypeScript and includes the navigation theme  \n\n\n## `components.json`\n\nThis works like [shadcn/ui's components.json](https://ui.shadcn.com/docs/components-json). It tells the CLI where to place files. You can leave it alone unless you're changing paths or switching styles.\n\n## `global.css`\n\nDefines your theme using CSS variables under `:root` and `.dark:root` (for dark mode). Tailwind classes like `bg-background` and `text-foreground` use these variables.\n\nYou can choose a custom theme from [shadcn/ui themes](https://ui.shadcn.com/themes), but make sure to:\n\n- Use the Tailwind v3 version (CSS variables)\n- Replace `.dark` with `.dark:root` for compatibility with Nativewind\n\nSee the [full list of CSS variables](https://ui.shadcn.com/docs/theming#list-of-variables) in the shadcn/ui documentation.\n\n## `tailwind.config.ts`\n\nConnects Tailwind utility classes (like `bg-card`, `text-muted`) to the CSS variables defined in `global.css`, while also configuring the dark mode selector, plugins, and animations.\n\n## `theme.ts`\n\nExports the same colors from `global.css` as a TypeScript object, so you can use them in logic, inline styles, or animations. Also includes `NAV_THEME` for the `ThemeProvider` in `_layout.tsx`.\n\nIf you update a CSS variable, update `theme.ts` as well.\n\n\n\n<div className='text-sm *:text-muted-foreground *:font-normal py-2 *:leading-7'>\n\n<div className='-mb-1.5 *:text-foreground'>\n  <span className='font-medium'>Tip</span>:  After updating CSS variables in `global.css`, use this prompt to sync `theme.ts`:\n</div>\n\n> Read CSS variables under `:root` and `.dark:root` in `global.css`.\n> Update the `light` and `dark` entries in the `THEME` object in `theme.ts` to match these values in HSL format.\n> Keep all keys and `NAV_THEME` unchanged.\n> Add new variables if missing; comment stale ones if no matching CSS variable exists.\n> Maintain the original formatting and key order.\n\n</div>"
  },
  {
    "path": "apps/docs/content/docs/index.mdx",
    "content": "---\ntitle: Introduction\n---\n\nimport { DownloadAppBanner } from '@docs/components/download-app-banner';\n\n<blockquote cite=\"https://ui.shadcn.com/docs\" className='text-fd-muted-foreground font-normal -mt-2'>\nThis is not a component library. It is how you build your component library.\n</blockquote>\n\n## Bringing the shadcn/ui experience to React Native\n\nBuilt with familiar tools and libraries, it follows consistent styling, structure, and naming conventions, letting you use your favorite design system to create beautiful universal apps.\n\n\n<div className=\"my-12\">\n<DownloadAppBanner />\n</div>\n\n\n## Key differences from shadcn/ui\n\n- <a href='https://www.nativewind.dev' target='_blank' rel='noreferrer' className='font-medium underline underline-offset-4 decoration-fd-muted-foreground/0 hover:decoration-fd-muted-foreground'>Nativewind</a> or <a href='https://www.uniwind.dev' target='_blank' rel='noreferrer' className='font-medium underline underline-offset-4 decoration-fd-muted-foreground/0 hover:decoration-fd-muted-foreground'>Uniwind</a>: React Native Reusables provides a Tailwind-like experience adapted for React Native, with support for both Nativewind and Uniwind.\n- <a href='https://rnprimitives.com' target='_blank' rel='noreferrer' className='font-medium underline underline-offset-4 decoration-fd-muted-foreground/0 hover:decoration-fd-muted-foreground'>RN Primitives:</a> A universal port of Radix UI primitives for React Native with an almost identical API, enabling consistent composition on native platforms.\n- <span className='font-medium'>Portals:</span> React Native doesn't support DOM portals. On native platforms, components like modals, and menus need a [`PortalHost`](https://rnprimitives.com/portal/).\n- <span className='font-medium'>No cascading styles:</span> Child elements like `Text` can't inherit styles from a parent class. Each element must be styled directly. We use a small [workaround](/docs/components/text#inheritance-system) for `Text`.\n- <span className='font-medium'>No data attributes:</span> React Native doesn't support `data-*` attributes, so variants rely on props or state for native platforms.\n- <a href='https://docs.swmansion.com/react-native-reanimated' target='_blank' rel='noreferrer' className='font-medium underline underline-offset-4 decoration-fd-muted-foreground/0 hover:decoration-fd-muted-foreground'>Reanimated:</a> Uses `react-native-reanimated` for smooth, native performance.\n- <span className='font-medium'>Icons:</span> Uses a wrapper component in combination with a <a href='https://lucide.dev/guide/packages/lucide-react-native' target='_blank' rel='noreferrer' className='underline underline-offset-4 decoration-fd-muted-foreground/0 hover:decoration-fd-muted-foreground'>Lucide icon</a> to avoid wrapping every imported icon individually (e.g. `<Icon as={LeftArrowIcon} />`).\n- <span className='font-medium'>Programmatic control:</span> Some components, such as `DropdownMenu`, can't be controlled with `open` or `onOpenChange` props. Instead, you use a `ref` to manage open and close behavior after layout calculation.\n\n<div className='h-2' />\n\nReact Native Reusables aims to stay true to the spirit of <a href='https://ui.shadcn.com' target='_blank' rel='noreferrer' className='underline underline-offset-4 decoration-fd-muted-foreground/0 hover:decoration-fd-muted-foreground'>shadcn/ui</a> while adapting it to the unique constraints of mobile/universal development.\n\n"
  },
  {
    "path": "apps/docs/content/docs/installation/index.mdx",
    "content": "---\ntitle: Installation\ndescription: Getting Started with React Native Reusables\n---\n\nimport { Button } from '@docs/components/ui/button';\nimport Link from 'next/link';\nimport { SquareTerminalIcon, WrenchIcon } from 'lucide-react';\nimport { InstallationTabs } from '@docs/components/installation-tabs';\nimport { CommandTabs } from '@docs/components/command-tabs';\n\n \n## Create project\n\nRun `init` to start a new project, or follow the manual steps to set up an existing one.\n\n<div className=\"h-4\" />\n\n<InstallationTabs value=\"cli\">\n\n<div className='h-px' />\n\n  <CommandTabs args={[\"init\"]}/>\n\n<div className='text-fd-muted-foreground'>\n  This creates a new project in the current directory. For more details, see the [init options](/docs/cli#init).\n</div>\n\n\n## Add components\n\nYou can now start adding components to your app.\n\n<CommandTabs args={[\"add\", \"button\"]} />\n\n<div className='pt-px'>\n  The command above will add the `Button` component to your project. You can then import it like this:\n</div>\n\n<div />\n\n```tsx title=\"index.tsx\"\n  import { Button } from '@/components/ui/button';\n  import { Text } from '@/components/ui/text';\n\n  export default function Screen() {\n    return (\n      <Button>\n        <Text>Click me</Text>\n      </Button>\n    );\n  }\n```\n\n<div className='text-fd-muted-foreground'>\n  For more details about the `add` command, see the [add options](/docs/cli#add).\n</div>\n  \n</InstallationTabs>"
  },
  {
    "path": "apps/docs/content/docs/installation/manual.mdx",
    "content": "---\ntitle: Installation\ndescription: Getting Started with React Native Reusables\n---\n\nimport { Button } from '@docs/components/ui/button';\nimport Link from 'next/link';\nimport { SquareTerminalIcon, WrenchIcon } from 'lucide-react';\nimport { InstallationTabs } from '@docs/components/installation-tabs';\nimport { Step, Steps } from 'fumadocs-ui/components/steps';\nimport { CommandTabs } from '@docs/components/command-tabs';\n\n## Create project\n\nRun `init` to start a new Expo project, or follow the manual steps to set up an existing one.\n\n<div className=\"h-4\" />\n\n<InstallationTabs value=\"manual\">\n\n  <Steps>\n    <Step>\n      ### Set up Nativewind \n      Follow the official installation guide to add [Nativewind](https://www.nativewind.dev/docs/getting-started/installation) to your project.\n    </Step>\n    <Step>\n      ### Update the default inlined `rem` value\n      Change the default `rem` value by setting `inlineRem` in your `metro.config.js`\n      ```diff title=\"metro.config.js\"\n      const { getDefaultConfig } = require('expo/metro-config');\n      const { withNativeWind } = require('nativewind/metro');\n\n      const config = getDefaultConfig(__dirname);\n\n      - module.exports = withNativeWind(config, { input: './global.css' });\n      + module.exports = withNativeWind(config, { input: './global.css', inlineRem: 16 });\n      ```\n    </Step>\n    <Step>\n      ### Add dependencies\n      Add the following dependencies to your project:\n\n      ```\n      npx expo install tailwindcss-animate class-variance-authority clsx tailwind-merge @rn-primitives/portal\n      ```\n    </Step>\n    <Step>\n      ### Add the Portal Host to your root layout\n      Render the `PortalHost` from [`@rn-primitives/portal`](https://rnprimitives.com/portal) in your root layout. Place it as the last child of your providers. This is where your components that use the `Portal` will be rendered (e.g. `DropdownMenu`, `Tooltip`, `Popover`, etc.).\n\n      ```diff title=\"app/_layout.tsx\"\n       <ThemeProvider value={NAV_THEME[colorScheme]}>\n         <StatusBar style={colorScheme === 'dark' ? 'light' : 'dark'} />\n         <Stack />\n      +  <PortalHost />\n       </ThemeProvider>\n      ```\n    </Step>\n    <Step>\n      ### Configure path aliases\n      Configure the path aliases in your `tsconfig.json` file.\n\n      ```json title=\"tsconfig.json\"\n      {\n        \"compilerOptions\": {\n          \"baseUrl\": \".\",\n          \"paths\": {\n            \"@/*\": [\"./*\"]\n          }\n        }\n      }\n      ```\n\n      `@` is a commonly used alias, but you're free to choose a different one.\n      \n    </Step>\n    <Step>\n      ### Configure your styles\n      There are 3 steps:\n      1. Add the CSS variables to your CSS file\n      ```css title=\"global.css\"\n      @tailwind base;\n      @tailwind components;\n      @tailwind utilities;\n\n      @layer base {\n        :root {\n          --background: 0 0% 100%;\n          --foreground: 0 0% 3.9%;\n          --card: 0 0% 100%;\n          --card-foreground: 0 0% 3.9%;\n          --popover: 0 0% 100%;\n          --popover-foreground: 0 0% 3.9%;\n          --primary: 0 0% 9%;\n          --primary-foreground: 0 0% 98%;\n          --secondary: 0 0% 96.1%;\n          --secondary-foreground: 0 0% 9%;\n          --muted: 0 0% 96.1%;\n          --muted-foreground: 0 0% 45.1%;\n          --accent: 0 0% 96.1%;\n          --accent-foreground: 0 0% 9%;\n          --destructive: 0 84.2% 60.2%;\n          --border: 0 0% 89.8%;\n          --input: 0 0% 89.8%;\n          --ring: 0 0% 63%;\n          --radius: 0.625rem;\n          --chart-1: 12 76% 61%;\n          --chart-2: 173 58% 39%;\n          --chart-3: 197 37% 24%;\n          --chart-4: 43 74% 66%;\n          --chart-5: 27 87% 67%;\n        }\n\n        .dark:root {\n          --background: 0 0% 3.9%;\n          --foreground: 0 0% 98%;\n          --card: 0 0% 3.9%;\n          --card-foreground: 0 0% 98%;\n          --popover: 0 0% 3.9%;\n          --popover-foreground: 0 0% 98%;\n          --primary: 0 0% 98%;\n          --primary-foreground: 0 0% 9%;\n          --secondary: 0 0% 14.9%;\n          --secondary-foreground: 0 0% 98%;\n          --muted: 0 0% 14.9%;\n          --muted-foreground: 0 0% 63.9%;\n          --accent: 0 0% 14.9%;\n          --accent-foreground: 0 0% 98%;\n          --destructive: 0 70.9% 59.4%;\n          --border: 0 0% 14.9%;\n          --input: 0 0% 14.9%;\n          --ring: 300 0% 45%;\n          --chart-1: 220 70% 50%;\n          --chart-2: 160 60% 45%;\n          --chart-3: 30 80% 55%;\n          --chart-4: 280 65% 60%;\n          --chart-5: 340 75% 55%;\n        }\n      }\n      ```\n      2. Add them to your `tailwind.config.js` file\n      ```js title=\"tailwind.config.js\"\n      const { hairlineWidth } = require('nativewind/theme');\n\n      /** @type {import('tailwindcss').Config} */\n      module.exports = {\n        darkMode: 'class',\n        content: ['./app/**/*.{ts,tsx}', './components/**/*.{ts,tsx}'],\n        presets: [require('nativewind/preset')],\n        theme: {\n          extend: {\n            colors: {\n              border: 'hsl(var(--border))',\n              input: 'hsl(var(--input))',\n              ring: 'hsl(var(--ring))',\n              background: 'hsl(var(--background))',\n              foreground: 'hsl(var(--foreground))',\n              primary: {\n                DEFAULT: 'hsl(var(--primary))',\n                foreground: 'hsl(var(--primary-foreground))',\n              },\n              secondary: {\n                DEFAULT: 'hsl(var(--secondary))',\n                foreground: 'hsl(var(--secondary-foreground))',\n              },\n              destructive: {\n                DEFAULT: 'hsl(var(--destructive))',\n                foreground: 'hsl(var(--destructive-foreground))',\n              },\n              muted: {\n                DEFAULT: 'hsl(var(--muted))',\n                foreground: 'hsl(var(--muted-foreground))',\n              },\n              accent: {\n                DEFAULT: 'hsl(var(--accent))',\n                foreground: 'hsl(var(--accent-foreground))',\n              },\n              popover: {\n                DEFAULT: 'hsl(var(--popover))',\n                foreground: 'hsl(var(--popover-foreground))',\n              },\n              card: {\n                DEFAULT: 'hsl(var(--card))',\n                foreground: 'hsl(var(--card-foreground))',\n              },\n            },\n            borderRadius: {\n              lg: 'var(--radius)',\n              md: 'calc(var(--radius) - 2px)',\n              sm: 'calc(var(--radius) - 4px)',\n            },\n            borderWidth: {\n              hairline: hairlineWidth(),\n            },\n            keyframes: {\n              'accordion-down': {\n                from: { height: '0' },\n                to: { height: 'var(--radix-accordion-content-height)' },\n              },\n              'accordion-up': {\n                from: { height: 'var(--radix-accordion-content-height)' },\n                to: { height: '0' },\n              },\n            },\n            animation: {\n              'accordion-down': 'accordion-down 0.2s ease-out',\n              'accordion-up': 'accordion-up 0.2s ease-out',\n            },\n          },\n        },\n        future: {\n          hoverOnlyWhenSupported: true,\n        },\n        plugins: [require('tailwindcss-animate')],\n      };\n\n      ```\n      3. Add them to your `theme.ts` file\n      ```ts title=\"lib/theme.ts\"\n      import { DarkTheme, DefaultTheme, type Theme } from '@react-navigation/native';\n\n      export const THEME = {\n        light: {\n          background: 'hsl(0 0% 100%)',\n          foreground: 'hsl(0 0% 3.9%)',\n          card: 'hsl(0 0% 100%)',\n          cardForeground: 'hsl(0 0% 3.9%)',\n          popover: 'hsl(0 0% 100%)',\n          popoverForeground: 'hsl(0 0% 3.9%)',\n          primary: 'hsl(0 0% 9%)',\n          primaryForeground: 'hsl(0 0% 98%)',\n          secondary: 'hsl(0 0% 96.1%)',\n          secondaryForeground: 'hsl(0 0% 9%)',\n          muted: 'hsl(0 0% 96.1%)',\n          mutedForeground: 'hsl(0 0% 45.1%)',\n          accent: 'hsl(0 0% 96.1%)',\n          accentForeground: 'hsl(0 0% 9%)',\n          destructive: 'hsl(0 84.2% 60.2%)',\n          border: 'hsl(0 0% 89.8%)',\n          input: 'hsl(0 0% 89.8%)',\n          ring: 'hsl(0 0% 63%)',\n          radius: '0.625rem',\n          chart1: 'hsl(12 76% 61%)',\n          chart2: 'hsl(173 58% 39%)',\n          chart3: 'hsl(197 37% 24%)',\n          chart4: 'hsl(43 74% 66%)',\n          chart5: 'hsl(27 87% 67%)',\n        },\n        dark: {\n          background: 'hsl(0 0% 3.9%)',\n          foreground: 'hsl(0 0% 98%)',\n          card: 'hsl(0 0% 3.9%)',\n          cardForeground: 'hsl(0 0% 98%)',\n          popover: 'hsl(0 0% 3.9%)',\n          popoverForeground: 'hsl(0 0% 98%)',\n          primary: 'hsl(0 0% 98%)',\n          primaryForeground: 'hsl(0 0% 9%)',\n          secondary: 'hsl(0 0% 14.9%)',\n          secondaryForeground: 'hsl(0 0% 98%)',\n          muted: 'hsl(0 0% 14.9%)',\n          mutedForeground: 'hsl(0 0% 63.9%)',\n          accent: 'hsl(0 0% 14.9%)',\n          accentForeground: 'hsl(0 0% 98%)',\n          destructive: 'hsl(0 70.9% 59.4%)',\n          border: 'hsl(0 0% 14.9%)',\n          input: 'hsl(0 0% 14.9%)',\n          ring: 'hsl(300 0% 45%)',\n          radius: '0.625rem',\n          chart1: 'hsl(220 70% 50%)',\n          chart2: 'hsl(160 60% 45%)',\n          chart3: 'hsl(30 80% 55%)',\n          chart4: 'hsl(280 65% 60%)',\n          chart5: 'hsl(340 75% 55%)',\n        },\n      };\n\n      export const NAV_THEME: Record<'light' | 'dark', Theme> = {\n        light: {\n          ...DefaultTheme,\n          colors: {\n            background: THEME.light.background,\n            border: THEME.light.border,\n            card: THEME.light.card,\n            notification: THEME.light.destructive,\n            primary: THEME.light.primary,\n            text: THEME.light.foreground,\n          },\n        },\n        dark: {\n          ...DarkTheme,\n          colors: {\n            background: THEME.dark.background,\n            border: THEME.dark.border,\n            card: THEME.dark.card,\n            notification: THEME.dark.destructive,\n            primary: THEME.dark.primary,\n            text: THEME.dark.foreground,\n          },\n        },\n      };\n      ```\n      <div className='text-fd-muted-foreground'>\n        For more details, see the [Customization](/docs/customization) page.\n      </div>\n\n    </Step>\n    <Step>\n      ### Add a cn helper\n\n      ```tsx title=\"lib/utils.ts\"\n      import { clsx, type ClassValue } from \"clsx\"\n      import { twMerge } from \"tailwind-merge\"\n\n      export function cn(...inputs: ClassValue[]) {\n        return twMerge(clsx(inputs))\n      }\n      ```\n    </Step>\n    <Step>\n      ### Create a `components.json` file\n\n      ```json title=\"components.json\"\n      {\n        \"$schema\": \"https://ui.shadcn.com/schema.json\",\n        \"style\": \"new-york\",\n        \"rsc\": false,\n        \"tsx\": true,\n        \"tailwind\": {\n          \"config\": \"tailwind.config.js\",\n          \"css\": \"global.css\",\n          \"baseColor\": \"neutral\",\n          \"cssVariables\": true\n        },\n        \"aliases\": {\n          \"components\": \"@/components\",\n          \"utils\": \"@/lib/utils\",\n          \"ui\": \"@/components/ui\",\n          \"lib\": \"@/lib\",\n          \"hooks\": \"@/hooks\"\n        }\n      }\n      ```\n    </Step>\n    <Step>\n      ### All set.\n      You're ready to start adding components to your app. You can run the `doctor` command to check if everything's set up correctly.\n\n      <CommandTabs args={[\"doctor\"]} />\n\n      <div className='text-fd-muted-foreground'>\n        For more details, see the [doctor options](/docs/cli#doctor) page.\n      </div>\n    </Step>\n  </Steps>\n\n</InstallationTabs>"
  },
  {
    "path": "apps/docs/content/docs/meta.json",
    "content": "{\n  \"title\": \"React Native Reusables\",\n  \"description\": \"\",\n  \"icon\": \"Building2\",\n  \"root\": true,\n  \"pages\": [\n    \"---Getting started---\",\n    \"!index\",\n    \"!installation\",\n    \"!customization\",\n    \"!cli\",\n    \"!changelog\",\n    \"[BookOpen][Introduction](/docs)\",\n    \"[FolderDown][Installation](/docs/installation)\",\n    \"[FileSliders][Customization](/docs/customization)\",\n    \"[SquareTerminal][CLI](/docs/cli)\",\n    \"[GitMerge][Changelog](/docs/changelog)\",\n    \"------\",\n    \"!/blocks\",\n    \"---Blocks---\",\n    \".../blocks\",\n    \"------\",\n    \"---Components---\",\n    \"!/components\",\n    \".../components\",\n    \"...\",\n    \"------\",\n    \"---Registry---\",\n    \"create-your-own-registry\",\n    \"------\",\n    \"---About us---\",\n    \"[FoundedLabs][Founded Labs](https://foundedlabs.com)\"\n  ]\n}\n"
  },
  {
    "path": "apps/docs/global.d.ts",
    "content": "declare module '!!raw-loader!*' {\n  const content: string;\n  export default content;\n}\n"
  },
  {
    "path": "apps/docs/lib/FoundedLabsIcon.tsx",
    "content": "export default function FoundedLabsIcon() {\n  return (\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <mask id=\"path-1-inside-1_65_525\" fill=\"white\">\n        <path d=\"M11.0615 0.608953C15.1434 2.29975 17.0818 6.9795 15.391 11.0615C13.7002 15.1434 9.02049 17.0818 4.93853 15.391C0.856576 13.7002 -1.08184 9.02048 0.608964 4.93852C2.29977 0.856565 6.97951 -1.08185 11.0615 0.608953ZM13.8223 4.87602C13.1665 3.68792 11.6718 3.25519 10.4835 3.91057C10.4529 3.92748 10.4217 3.94524 10.39 3.96275C9.05454 4.69982 8.69538 6.6563 7.79175 7.88519C6.98751 8.97829 5.44949 9.21298 4.35609 8.40913C4.22466 8.31247 4.10542 8.20496 3.99928 8.08904C3.80011 7.87151 3.48013 7.77683 3.22188 7.91924C2.03368 8.57507 1.60089 10.0697 2.25643 11.258C2.91233 12.4463 4.4085 12.8779 5.59687 12.222C5.62657 12.2057 5.6567 12.1888 5.68743 12.1718C7.02305 11.4347 7.38314 9.47785 8.28695 8.24886C9.09122 7.15538 10.63 6.92107 11.7235 7.7253C11.854 7.82128 11.9719 7.92783 12.0771 8.04299C12.2767 8.26143 12.5986 8.35799 12.8577 8.21519C14.0461 7.55937 14.478 6.06442 13.8223 4.87602Z\" />\n      </mask>\n      <path\n        d=\"M11.0615 0.608953L11.6355 -0.776866L11.0615 0.608953ZM15.391 11.0615L16.7769 11.6355L15.391 11.0615ZM4.93853 15.391L4.36451 16.7768L4.93853 15.391ZM0.608964 4.93852L-0.776856 4.3645L0.608964 4.93852ZM13.8223 4.87602L15.1356 4.15139L15.1355 4.15115L13.8223 4.87602ZM10.4835 3.91057L9.75905 2.59711L9.75861 2.59735L10.4835 3.91057ZM10.39 3.96275L9.6652 2.64949L9.66519 2.64949L10.39 3.96275ZM7.79175 7.88519L8.99997 8.77413L9.00022 8.77379L7.79175 7.88519ZM4.35609 8.40913L3.46739 9.61752L3.46759 9.61767L4.35609 8.40913ZM3.99928 8.08904L2.89293 9.10196L2.89298 9.102L3.99928 8.08904ZM3.22188 7.91924L2.49757 6.6057L2.49703 6.606L3.22188 7.91924ZM2.25643 11.258L0.943019 11.9826L0.943204 11.9829L2.25643 11.258ZM5.59687 12.222L6.32162 13.5353L6.32174 13.5353L5.59687 12.222ZM5.68743 12.1718L4.96263 10.8586L5.68743 12.1718ZM8.28695 8.24886L7.0786 7.36011L7.07855 7.36018L8.28695 8.24886ZM11.7235 7.7253L12.6125 6.5171L12.6122 6.51691L11.7235 7.7253ZM12.0771 8.04299L13.1845 7.03121L13.1844 7.03113L12.0771 8.04299ZM12.8577 8.21519L13.5818 9.52888L13.5825 9.52848L12.8577 8.21519ZM11.0615 0.608953L10.4874 1.99477C13.804 3.36855 15.379 7.17084 14.0052 10.4874L15.391 11.0615L16.7769 11.6355C18.7847 6.78816 16.4828 1.23096 11.6355 -0.776866L11.0615 0.608953ZM15.391 11.0615L14.0052 10.4874C12.6314 13.804 8.82915 15.379 5.51256 14.0052L4.93853 15.391L4.36451 16.7768C9.21183 18.7847 14.769 16.4828 16.7769 11.6355L15.391 11.0615ZM4.93853 15.391L5.51256 14.0052C2.19597 12.6314 0.621007 8.82914 1.99478 5.51255L0.608964 4.93852L-0.776856 4.3645C-2.78468 9.21182 -0.482816 14.769 4.36451 16.7768L4.93853 15.391ZM0.608964 4.93852L1.99478 5.51255C3.36856 2.19596 7.17085 0.620996 10.4874 1.99477L11.0615 0.608953L11.6355 -0.776866C6.78817 -2.78469 1.23097 -0.482827 -0.776856 4.3645L0.608964 4.93852ZM13.8223 4.87602L15.1355 4.15115C14.08 2.23889 11.6735 1.5412 9.75905 2.59711L10.4835 3.91057L11.2079 5.22404C11.67 4.96917 12.253 5.13696 12.5091 5.6009L13.8223 4.87602ZM10.4835 3.91057L9.75861 2.59735C9.73785 2.60881 9.7177 2.62013 9.70305 2.62835C9.68682 2.63746 9.67566 2.64371 9.6652 2.64949L10.39 3.96275L11.1148 5.27602C11.1361 5.26429 11.1563 5.2529 11.1713 5.24452C11.1878 5.23526 11.1985 5.22924 11.2084 5.2238L10.4835 3.91057ZM10.39 3.96275L9.66519 2.64949C8.56651 3.25587 7.97213 4.30371 7.58894 5.06544C7.13006 5.97763 6.93576 6.51724 6.58329 6.99659L7.79175 7.88519L9.00022 8.77379C9.55137 8.02424 9.98847 6.97116 10.2689 6.41363C10.6251 5.70563 10.878 5.4067 11.1148 5.27601L10.39 3.96275ZM7.79175 7.88519L6.58354 6.99625C6.26995 7.42247 5.67048 7.5137 5.24459 7.20059L4.35609 8.40913L3.46759 9.61767C5.2285 10.9123 7.70507 10.5341 8.99997 8.77413L7.79175 7.88519ZM4.35609 8.40913L5.24479 7.20074C5.19219 7.16206 5.14581 7.12001 5.10558 7.07607L3.99928 8.08904L2.89298 9.102C3.06502 9.2899 3.25713 9.46289 3.46739 9.61752L4.35609 8.40913ZM3.99928 8.08904L5.10562 7.07612C4.57133 6.49255 3.51874 6.04261 2.49757 6.6057L3.22188 7.91924L3.94618 9.23278C3.70627 9.36507 3.45984 9.37044 3.2813 9.32741C3.11277 9.2868 2.98411 9.20155 2.89293 9.10196L3.99928 8.08904ZM3.22188 7.91924L2.49703 6.606C0.584727 7.66151 -0.113182 10.0679 0.943019 11.9826L2.25643 11.258L3.56984 10.5335C3.31497 10.0715 3.48264 9.48863 3.94672 9.23248L3.22188 7.91924ZM2.25643 11.258L0.943204 11.9829C1.99965 13.8968 4.40841 14.5912 6.32162 13.5353L5.59687 12.222L4.87212 10.9088C4.40859 11.1646 3.82502 10.9958 3.56965 10.5332L2.25643 11.258ZM5.59687 12.222L6.32174 13.5353C6.33885 13.5258 6.35577 13.5164 6.37047 13.5083C6.38582 13.4997 6.39913 13.4923 6.41224 13.4851L5.68743 12.1718L4.96263 10.8586C4.94501 10.8683 4.92788 10.8778 4.91306 10.886C4.89758 10.8946 4.88458 10.9019 4.87199 10.9088L5.59687 12.222ZM5.68743 12.1718L6.41224 13.4851C7.51083 12.8788 8.1055 11.831 8.48896 11.0692C8.94815 10.1569 9.1427 9.61709 9.49536 9.13754L8.28695 8.24886L7.07855 7.36018C6.5274 8.10962 6.08999 9.16268 5.80928 9.72037C5.45284 10.4285 5.19966 10.7277 4.96263 10.8586L5.68743 12.1718ZM8.28695 8.24886L9.49531 9.13761C9.80858 8.71168 10.4084 8.6201 10.8348 8.93369L11.7235 7.7253L12.6122 6.51691C10.8516 5.22203 8.37385 5.59907 7.0786 7.36011L8.28695 8.24886ZM11.7235 7.7253L10.8345 8.93349C10.8854 8.97092 10.9303 9.0116 10.9698 9.05485L12.0771 8.04299L13.1844 7.03113C13.0135 6.84405 12.8225 6.67164 12.6125 6.5171L11.7235 7.7253ZM12.0771 8.04299L10.9697 9.05478C11.5006 9.63583 12.5552 10.0946 13.5818 9.52888L12.8577 8.21519L12.1337 6.9015C12.3761 6.76789 12.6237 6.76416 12.8003 6.80722C12.967 6.84785 13.0941 6.93228 13.1845 7.03121L12.0771 8.04299ZM12.8577 8.21519L13.5825 9.52848C15.496 8.47248 16.1916 6.06519 15.1356 4.15139L13.8223 4.87602L12.5089 5.60066C12.7644 6.06366 12.5962 6.64627 12.133 6.9019L12.8577 8.21519Z\"\n        fill=\"currentColor\"\n        mask=\"url(#path-1-inside-1_65_525)\"\n      />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "apps/docs/lib/file-generator.ts",
    "content": "import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Code, Paragraph } from 'mdast';\nimport { z } from 'zod';\nimport { DocGenerator } from 'fumadocs-docgen';\n\n// This project uses code from fumadocs.\n// The code is licensed under the MIT License.\n// https://github.com/fuma-nama/fumadocs\n\nconst fileGeneratorSchema = z.object({\n  file: z.string(),\n\n  /**\n   * Turn file content into a code block\n   *\n   * @defaultValue false\n   */\n  codeblock: z\n    .union([\n      z.object({\n        lang: z.string().optional(),\n        meta: z.string().optional(),\n      }),\n      z.boolean(),\n    ])\n    .default(false),\n});\n\nexport function fileGenerator(): DocGenerator {\n  return {\n    name: 'file',\n    async run(input, ctx) {\n      const { file, codeblock = false } = fileGeneratorSchema.parse(input);\n\n      const dest = path.resolve(ctx.cwd, file);\n      const value = fixImports(await fs.readFile(dest).then((res) => res.toString()));\n\n      if (codeblock === false) {\n        return {\n          type: 'paragraph',\n          children: [{ type: 'text', value }],\n        } as Paragraph;\n      }\n\n      const codeOptions = codeblock === true ? {} : codeblock;\n\n      return {\n        type: 'code',\n        lang: codeOptions.lang ?? path.extname(dest).slice(1),\n        meta: codeOptions.meta,\n        value,\n      } as Code;\n    },\n  };\n}\n\nfunction fixImports(value: string) {\n  return value\n    .replaceAll('@/registry/nativewind/', '@/')\n    .replaceAll('@/registry/uniwind/', '@/')\n    .replaceAll('@/registry/blocks/', '@/components/');\n}\n"
  },
  {
    "path": "apps/docs/lib/source.ts",
    "content": "import { docs, meta } from '@docs/.source';\nimport { loader } from 'fumadocs-core/source';\nimport { createMDXSource } from 'fumadocs-mdx';\nimport { icons } from 'lucide-react';\nimport { createElement } from 'react';\nimport FoundedLabsIcon from './FoundedLabsIcon';\n\nexport const source = loader({\n  baseUrl: '/docs',\n  source: createMDXSource(docs, meta),\n  icon(icon) {\n    if (!icon) {\n      return;\n    }\n    if (icon === 'FoundedLabs') {\n      return createElement(FoundedLabsIcon);\n    }\n\n    if (icon in icons) return createElement(icons[icon as keyof typeof icons]);\n  },\n});\n"
  },
  {
    "path": "apps/docs/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/docs/nativewind-env.d.ts",
    "content": "/// <reference types=\"nativewind/types\" />\n"
  },
  {
    "path": "apps/docs/next.config.mjs",
    "content": "import { createMDX } from 'fumadocs-mdx/next';\n\nconst withMDX = createMDX({\n  extension: /\\.mdx?$/,\n});\n\n/** @type {import('next').NextConfig} */\nconst config = {\n  reactStrictMode: true,\n  pageExtensions: ['js', 'jsx', 'mdx', 'ts', 'tsx'],\n  transpilePackages: [\n    '@rnr/registry',\n    'react-native',\n    'react-native-web',\n    'expo',\n    'nativewind',\n    'react-native-css-interop',\n    'react-native-reanimated',\n    'react-native-worklets',\n    'react-native-gesture-handler',\n    'expo-haptics',\n    'expo-router',\n    'react-navigation',\n    'expo-modules-core',\n  ],\n  images: {\n    remotePatterns: [\n      {\n        protocol: 'https',\n        hostname: 'avatars.githubusercontent.com',\n      },\n      {\n        protocol: 'https',\n        hostname: 'images.unsplash.com',\n      },\n    ],\n  },\n  experimental: {\n    forceSwcTransforms: true,\n  },\n  // TODO(zach)\n  eslint: {\n    ignoreDuringBuilds: true,\n  },\n  typescript: {\n    ignoreBuildErrors: true,\n  },\n  compiler: {\n    removeConsole: process.env.NODE_ENV === 'production' ? { exclude: ['error'] } : false,\n  },\n  async redirects() {\n    return [\n      {\n        source: '/getting-started/introduction',\n        destination: '/',\n        permanent: true,\n      },\n      {\n        source: '/getting-started/initial-setup',\n        destination: '/docs/installation',\n        permanent: true,\n      },\n      {\n        source: '/components/:slug',\n        destination: '/docs/components/:slug',\n        permanent: true,\n      },\n    ];\n  },\n};\n\nexport default withMDX(withExpo(config));\n\n// https://github.com/expo/expo-webpack-integrations/blob/main/packages/next-adapter/src/index.ts\nfunction withExpo(nextConfig) {\n  return {\n    ...nextConfig,\n    webpack(config, options) {\n      // Mix in aliases\n      if (!config.resolve) {\n        config.resolve = {};\n      }\n\n      config.resolve.alias = {\n        ...(config.resolve.alias || {}),\n        // Alias direct react-native imports to react-native-web\n        'react-native$': 'react-native-web',\n        // Alias internal react-native modules to react-native-web\n        'react-native/Libraries/EventEmitter/RCTDeviceEventEmitter$':\n          'react-native-web/dist/vendor/react-native/NativeEventEmitter/RCTDeviceEventEmitter',\n        'react-native/Libraries/vendor/emitter/EventEmitter$':\n          'react-native-web/dist/vendor/react-native/emitter/EventEmitter',\n        'react-native/Libraries/EventEmitter/NativeEventEmitter$':\n          'react-native-web/dist/vendor/react-native/NativeEventEmitter',\n      };\n\n      config.resolve.extensions = [\n        '.web.js',\n        '.web.jsx',\n        '.web.ts',\n        '.web.tsx',\n        ...(config.resolve?.extensions ?? []),\n      ];\n\n      if (!config.plugins) {\n        config.plugins = [];\n      }\n\n      // Expose __DEV__ from Metro.\n      config.plugins.push(\n        new options.webpack.DefinePlugin({\n          __DEV__: JSON.stringify(process.env.NODE_ENV !== 'production'),\n        })\n      );\n\n      // Execute the user-defined webpack config.\n      if (typeof nextConfig.webpack === 'function') {\n        return nextConfig.webpack(config, options);\n      }\n\n      return config;\n    },\n  };\n}\n"
  },
  {
    "path": "apps/docs/package.json",
    "content": "{\n  \"name\": \"@rnr/docs\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"build\": \"next build\",\n    \"clean\": \"rm -rf .next .source node_modules\",\n    \"dev\": \"next dev\",\n    \"start\": \"next start\",\n    \"registry:build:all\": \"pnpm registry:generate:local && pnpm registry:build:nativewind && pnpm registry:build:nativewind:local && pnpm registry:build:uniwind && pnpm registry:build:uniwind:local\",\n    \"registry:build:nativewind\": \"shadcn build ./registry/nativewind.json --output ./public/r/nativewind\",\n    \"registry:build:nativewind:local\": \"shadcn build ./registry/nativewind.local.json --output ./public/local/r/nativewind\",\n    \"registry:build:uniwind\": \"shadcn build ./registry/uniwind.json --output ./public/r/uniwind\",\n    \"registry:build:uniwind:local\": \"shadcn build ./registry/uniwind.local.json --output ./public/local/r/uniwind\",\n    \"registry:generate:local\": \"node ./scripts/generate-local-registry.js\",\n    \"postinstall\": \"fumadocs-mdx\"\n  },\n  \"dependencies\": {\n    \"@radix-ui/react-select\": \"^2.2.5\",\n    \"@radix-ui/react-slot\": \"^1.2.3\",\n    \"@radix-ui/react-tabs\": \"^1.1.12\",\n    \"@rnr/registry\": \"workspace:*\",\n    \"@vercel/analytics\": \"^1.5.0\",\n    \"class-variance-authority\": \"^0.7.1\",\n    \"clsx\": \"^2.1.1\",\n    \"cookies-next\": \"6.0.0\",\n    \"fumadocs-core\": \"14.7.2\",\n    \"fumadocs-docgen\": \"^1.3.4\",\n    \"fumadocs-mdx\": \"11.2.3\",\n    \"fumadocs-ui\": \"14.7.2\",\n    \"lucide-react\": \"^0.471.1\",\n    \"nativewind\": \"^4.2.2\",\n    \"next\": \"15.3.6\",\n    \"qrcode.react\": \"^4.2.0\",\n    \"react\": \"19.2.0\",\n    \"react-dom\": \"19.2.0\",\n    \"react-native\": \"0.83.2\",\n    \"react-native-reanimated\": \"~4.2.1\",\n    \"react-native-svg\": \"15.15.3\",\n    \"react-native-web\": \"~0.21.1\",\n    \"react-native-worklets\": \"0.7.2\",\n    \"remark-variables\": \"^1.4.9\",\n    \"shadcn\": \"2.9.2\",\n    \"tailwind-merge\": \"^3.5.0\",\n    \"tailwindcss-animate\": \"^1.0.7\",\n    \"zod\": \"^4.3.6\"\n  },\n  \"devDependencies\": {\n    \"@types/mdx\": \"^2.0.13\",\n    \"@types/node\": \"22.10.5\",\n    \"@types/react\": \"~19.2.14\",\n    \"@types/react-dom\": \"~19.1.7\",\n    \"autoprefixer\": \"^10.4.20\",\n    \"eslint\": \"^8\",\n    \"eslint-config-next\": \"15.1.3\",\n    \"postcss\": \"^8.4.49\",\n    \"raw-loader\": \"^4.0.2\",\n    \"tailwindcss\": \"^3.4.14\",\n    \"typescript\": \"^5.9.3\"\n  }\n}\n"
  },
  {
    "path": "apps/docs/postcss.config.js",
    "content": "module.exports = {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n  },\n};\n"
  },
  {
    "path": "apps/docs/public/.well-known/apple-app-site-association",
    "content": "{\n    \"applinks\": {\n        \"details\": [\n            {\n                \"appID\" : \"HA68FZH26V.com.reactnativereusables.app\",\n                \"paths\": [\"/showcase/links/*\"]\n\n            }\n        ]\n    }\n}"
  },
  {
    "path": "apps/docs/public/.well-known/assetlinks.json",
    "content": "[\n  {\n    \"relation\": [\n      \"delegate_permission/common.handle_all_urls\",\n      \"delegate_permission/common.get_login_creds\"\n    ],\n    \"target\": {\n      \"namespace\": \"android_app\",\n      \"package_name\": \"com.reactnativereusables.app\",\n      \"sha256_cert_fingerprints\": [\n        \"F7:0C:7B:38:A3:7F:9E:F0:85:5F:44:DF:54:F1:85:17:22:86:2D:F5:F5:ED:BF:34:C1:BD:03:6E:5C:51:CA:BB\"\n      ]\n    }\n  },\n  {\n    \"relation\": [\n      \"delegate_permission/common.handle_all_urls\",\n      \"delegate_permission/common.get_login_creds\"\n    ],\n    \"target\": {\n      \"namespace\": \"android_app\",\n      \"package_name\": \"com.reactnativereusables.android\",\n      \"sha256_cert_fingerprints\": [\n        \"48:D9:BD:31:EA:96:A2:18:06:B7:FD:5B:2E:C0:3B:B4:54:75:E1:BC:04:CE:54:E3:4B:84:3D:18:31:8C:14:AA\"\n      ]\n    }\n  }\n]\n"
  },
  {
    "path": "apps/docs/public/r/nativewind/accordion.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"accordion\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Accordion\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A vertically stacked set of interactive headings that each reveal a section of content.\",\n  \"dependencies\": [\n    \"@rn-primitives/accordion\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\",\n    \"https://reactnativereusables.com/r/nativewind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/accordion.tsx\",\n      \"content\": \"import { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as AccordionPrimitive from '@rn-primitives/accordion';\\nimport { ChevronDown } from 'lucide-react-native';\\nimport { Platform, Pressable, View } from 'react-native';\\nimport Animated, {\\n  FadeOutUp,\\n  LayoutAnimationConfig,\\n  LinearTransition,\\n  useAnimatedStyle,\\n  useDerivedValue,\\n  withTiming,\\n} from 'react-native-reanimated';\\n\\nfunction Accordion({\\n  children,\\n  ...props\\n}: Omit<AccordionPrimitive.RootProps, 'asChild'> &\\n  React.RefAttributes<AccordionPrimitive.RootRef>) {\\n  return (\\n    <LayoutAnimationConfig skipEntering>\\n      <AccordionPrimitive.Root\\n        {...(props as AccordionPrimitive.RootProps)}\\n        asChild={Platform.OS !== 'web'}>\\n        <Animated.View layout={LinearTransition.duration(200)}>{children}</Animated.View>\\n      </AccordionPrimitive.Root>\\n    </LayoutAnimationConfig>\\n  );\\n}\\n\\nfunction AccordionItem({\\n  children,\\n  className,\\n  value,\\n  ...props\\n}: AccordionPrimitive.ItemProps & React.RefAttributes<AccordionPrimitive.ItemRef>) {\\n  return (\\n    <AccordionPrimitive.Item\\n      className={cn(\\n        'border-border border-b',\\n        Platform.select({ web: 'last:border-b-0' }),\\n        className\\n      )}\\n      value={value}\\n      asChild={Platform.OS !== 'web'}\\n      {...props}>\\n      <Animated.View\\n        className=\\\"native:overflow-hidden\\\"\\n        layout={Platform.select({ native: LinearTransition.duration(200) })}>\\n        {children}\\n      </Animated.View>\\n    </AccordionPrimitive.Item>\\n  );\\n}\\n\\nconst Trigger = Platform.OS === 'web' ? View : Pressable;\\n\\nfunction AccordionTrigger({\\n  className,\\n  children,\\n  ...props\\n}: AccordionPrimitive.TriggerProps & {\\n  children?: React.ReactNode;\\n} & React.RefAttributes<AccordionPrimitive.TriggerRef>) {\\n  const { isExpanded } = AccordionPrimitive.useItemContext();\\n\\n  const progress = useDerivedValue(\\n    () => (isExpanded ? withTiming(1, { duration: 250 }) : withTiming(0, { duration: 200 })),\\n    [isExpanded]\\n  );\\n  const chevronStyle = useAnimatedStyle(\\n    () => ({\\n      transform: [{ rotate: `${progress.value * 180}deg` }],\\n    }),\\n    [progress]\\n  );\\n\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-left text-sm font-medium',\\n        Platform.select({ web: 'group-hover:underline' })\\n      )}>\\n      <AccordionPrimitive.Header>\\n        <AccordionPrimitive.Trigger {...props} asChild>\\n          <Trigger\\n            className={cn(\\n              'flex-row items-start justify-between gap-4 rounded-md py-4 disabled:opacity-50',\\n              Platform.select({\\n                web: 'focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 outline-none transition-all hover:underline focus-visible:ring-[3px] disabled:pointer-events-none [&[data-state=open]>svg]:rotate-180',\\n              }),\\n              className\\n            )}>\\n            <>{children}</>\\n            <Animated.View style={chevronStyle}>\\n              <Icon\\n                as={ChevronDown}\\n                size={16}\\n                className={cn(\\n                  'text-muted-foreground shrink-0',\\n                  Platform.select({\\n                    web: 'pointer-events-none translate-y-0.5 transition-transform duration-200',\\n                  })\\n                )}\\n              />\\n            </Animated.View>\\n          </Trigger>\\n        </AccordionPrimitive.Trigger>\\n      </AccordionPrimitive.Header>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction AccordionContent({\\n  className,\\n  children,\\n  ...props\\n}: AccordionPrimitive.ContentProps & React.RefAttributes<AccordionPrimitive.ContentRef>) {\\n  const { isExpanded } = AccordionPrimitive.useItemContext();\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm\\\">\\n      <AccordionPrimitive.Content\\n        className={cn(\\n          'overflow-hidden',\\n          Platform.select({\\n            web: isExpanded ? 'animate-accordion-down' : 'animate-accordion-up',\\n          })\\n        )}\\n        {...props}>\\n        <Animated.View\\n          exiting={Platform.select({ native: FadeOutUp.duration(200) })}\\n          className={cn('pb-4', className)}>\\n          {children}\\n        </Animated.View>\\n      </AccordionPrimitive.Content>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/alert-dialog.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"alert-dialog\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Alert Dialog\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A modal dialog that interrupts the user with important content and expects a response.\",\n  \"dependencies\": [\n    \"@rn-primitives/alert-dialog\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/alert-dialog.tsx\",\n      \"content\": \"import { buttonTextVariants, buttonVariants } from '@/registry/nativewind/components/ui/button';\\nimport { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as AlertDialogPrimitive from '@rn-primitives/alert-dialog';\\nimport * as React from 'react';\\nimport { Platform, View, type ViewProps } from 'react-native';\\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst AlertDialog = AlertDialogPrimitive.Root;\\n\\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\\n\\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction AlertDialogOverlay({\\n  className,\\n  children,\\n  ...props\\n}: Omit<AlertDialogPrimitive.OverlayProps, 'asChild'> &\\n  React.RefAttributes<AlertDialogPrimitive.OverlayRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <FullWindowOverlay>\\n      <AlertDialogPrimitive.Overlay\\n        className={cn(\\n          'absolute bottom-0 left-0 right-0 top-0 z-50 flex items-center justify-center bg-black/50 p-2',\\n          Platform.select({\\n            web: 'animate-in fade-in-0 fixed',\\n          }),\\n          className\\n        )}\\n        {...props}>\\n        <NativeOnlyAnimatedView\\n          entering={FadeIn.duration(200).delay(50)}\\n          exiting={FadeOut.duration(150)}>\\n          <>{children}</>\\n        </NativeOnlyAnimatedView>\\n      </AlertDialogPrimitive.Overlay>\\n    </FullWindowOverlay>\\n  );\\n}\\n\\nfunction AlertDialogContent({\\n  className,\\n  portalHost,\\n  ...props\\n}: AlertDialogPrimitive.ContentProps &\\n  React.RefAttributes<AlertDialogPrimitive.ContentRef> & {\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <AlertDialogPortal hostName={portalHost}>\\n      <AlertDialogOverlay>\\n        <AlertDialogPrimitive.Content\\n          className={cn(\\n            'bg-background border-border z-50 flex w-full max-w-[calc(100%-2rem)] flex-col gap-4 rounded-lg border p-6 shadow-lg shadow-black/5 sm:max-w-lg',\\n            Platform.select({\\n              web: 'animate-in fade-in-0 zoom-in-95 duration-200',\\n            }),\\n            className\\n          )}\\n          {...props}\\n        />\\n      </AlertDialogOverlay>\\n    </AlertDialogPortal>\\n  );\\n}\\n\\nfunction AlertDialogHeader({ className, ...props }: ViewProps) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-center sm:text-left\\\">\\n      <View className={cn('flex flex-col gap-2', className)} {...props} />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction AlertDialogFooter({ className, ...props }: ViewProps) {\\n  return (\\n    <View\\n      className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction AlertDialogTitle({\\n  className,\\n  ...props\\n}: AlertDialogPrimitive.TitleProps & React.RefAttributes<AlertDialogPrimitive.TitleRef>) {\\n  return (\\n    <AlertDialogPrimitive.Title\\n      className={cn('text-foreground text-lg font-semibold', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction AlertDialogDescription({\\n  className,\\n  ...props\\n}: AlertDialogPrimitive.DescriptionProps &\\n  React.RefAttributes<AlertDialogPrimitive.DescriptionRef>) {\\n  return (\\n    <AlertDialogPrimitive.Description\\n      className={cn('text-muted-foreground text-sm', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction AlertDialogAction({\\n  className,\\n  ...props\\n}: AlertDialogPrimitive.ActionProps & React.RefAttributes<AlertDialogPrimitive.ActionRef>) {\\n  return (\\n    <TextClassContext.Provider value={buttonTextVariants({ className })}>\\n      <AlertDialogPrimitive.Action className={cn(buttonVariants(), className)} {...props} />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction AlertDialogCancel({\\n  className,\\n  ...props\\n}: AlertDialogPrimitive.CancelProps & React.RefAttributes<AlertDialogPrimitive.CancelRef>) {\\n  return (\\n    <TextClassContext.Provider value={buttonTextVariants({ className, variant: 'outline' })}>\\n      <AlertDialogPrimitive.Cancel\\n        className={cn(buttonVariants({ variant: 'outline' }), className)}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nexport {\\n  AlertDialog,\\n  AlertDialogAction,\\n  AlertDialogCancel,\\n  AlertDialogContent,\\n  AlertDialogDescription,\\n  AlertDialogFooter,\\n  AlertDialogHeader,\\n  AlertDialogOverlay,\\n  AlertDialogPortal,\\n  AlertDialogTitle,\\n  AlertDialogTrigger,\\n};\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/alert.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"alert\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Alert\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a callout for user attention.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\",\n    \"https://reactnativereusables.com/r/nativewind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/alert.tsx\",\n      \"content\": \"import { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport { Text, TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport type { LucideIcon } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport { View, type ViewProps } from 'react-native';\\n\\nfunction Alert({\\n  className,\\n  variant,\\n  children,\\n  icon,\\n  iconClassName,\\n  ...props\\n}: ViewProps &\\n  React.RefAttributes<View> & {\\n    icon: LucideIcon;\\n    variant?: 'default' | 'destructive';\\n    iconClassName?: string;\\n  }) {\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm text-foreground',\\n        variant === 'destructive' && 'text-destructive',\\n        className\\n      )}>\\n      <View\\n        role=\\\"alert\\\"\\n        className={cn(\\n          'bg-card border-border relative w-full rounded-lg border px-4 pb-2 pt-3.5',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-3.5 top-3\\\">\\n          <Icon\\n            as={icon}\\n            className={cn('size-4', variant === 'destructive' && 'text-destructive', iconClassName)}\\n          />\\n        </View>\\n        {children}\\n      </View>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction AlertTitle({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\\n  return (\\n    <Text\\n      className={cn('mb-1 ml-0.5 min-h-4 pl-6 font-medium leading-none tracking-tight', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction AlertDescription({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\\n  const textClass = React.useContext(TextClassContext);\\n  return (\\n    <Text\\n      className={cn(\\n        'text-muted-foreground ml-0.5 pb-1.5 pl-6 text-sm leading-relaxed',\\n        textClass?.includes('text-destructive') && 'text-destructive/90',\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Alert, AlertDescription, AlertTitle };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/aspect-ratio.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"aspect-ratio\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Aspect Ratio\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays content within a desired ratio.\",\n  \"dependencies\": [\n    \"@rn-primitives/aspect-ratio\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/aspect-ratio.tsx\",\n      \"content\": \"import * as AspectRatioPrimitive from '@rn-primitives/aspect-ratio';\\n\\nconst AspectRatio = AspectRatioPrimitive.Root;\\n\\nexport { AspectRatio };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/avatar.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"avatar\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Avatar\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"An image element with a fallback for representing the user.\",\n  \"dependencies\": [\n    \"@rn-primitives/avatar\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/avatar.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport * as AvatarPrimitive from '@rn-primitives/avatar';\\n\\nfunction Avatar({\\n  className,\\n  ...props\\n}: AvatarPrimitive.RootProps & React.RefAttributes<AvatarPrimitive.RootRef>) {\\n  return (\\n    <AvatarPrimitive.Root\\n      className={cn('relative flex size-8 shrink-0 overflow-hidden rounded-full', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction AvatarImage({\\n  className,\\n  ...props\\n}: AvatarPrimitive.ImageProps & React.RefAttributes<AvatarPrimitive.ImageRef>) {\\n  return <AvatarPrimitive.Image className={cn('aspect-square size-full', className)} {...props} />;\\n}\\n\\nfunction AvatarFallback({\\n  className,\\n  ...props\\n}: AvatarPrimitive.FallbackProps & React.RefAttributes<AvatarPrimitive.FallbackRef>) {\\n  return (\\n    <AvatarPrimitive.Fallback\\n      className={cn(\\n        'bg-muted flex size-full flex-row items-center justify-center rounded-full',\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Avatar, AvatarFallback, AvatarImage };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/badge.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"badge\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Badge\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a badge or a component that looks like a badge.\",\n  \"dependencies\": [\n    \"@rn-primitives/slot\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/badge.tsx\",\n      \"content\": \"import { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as Slot from '@rn-primitives/slot';\\nimport { cva, type VariantProps } from 'class-variance-authority';\\nimport { Platform, View, ViewProps } from 'react-native';\\n\\nconst badgeVariants = cva(\\n  cn(\\n    'border-border group shrink-0 flex-row items-center justify-center gap-1 overflow-hidden rounded-full border px-2 py-0.5',\\n    Platform.select({\\n      web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive w-fit whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] [&>svg]:pointer-events-none [&>svg]:size-3',\\n    })\\n  ),\\n  {\\n    variants: {\\n      variant: {\\n        default: cn(\\n          'bg-primary border-transparent',\\n          Platform.select({ web: '[a&]:hover:bg-primary/90' })\\n        ),\\n        secondary: cn(\\n          'bg-secondary border-transparent',\\n          Platform.select({ web: '[a&]:hover:bg-secondary/90' })\\n        ),\\n        destructive: cn(\\n          'bg-destructive border-transparent',\\n          Platform.select({ web: '[a&]:hover:bg-destructive/90' })\\n        ),\\n        outline: Platform.select({ web: '[a&]:hover:bg-accent [a&]:hover:text-accent-foreground' }),\\n      },\\n    },\\n    defaultVariants: {\\n      variant: 'default',\\n    },\\n  }\\n);\\n\\nconst badgeTextVariants = cva('text-xs font-medium', {\\n  variants: {\\n    variant: {\\n      default: 'text-primary-foreground',\\n      secondary: 'text-secondary-foreground',\\n      destructive: 'text-white',\\n      outline: 'text-foreground',\\n    },\\n  },\\n  defaultVariants: {\\n    variant: 'default',\\n  },\\n});\\n\\ntype BadgeProps = ViewProps &\\n  React.RefAttributes<View> & {\\n    asChild?: boolean;\\n  } & VariantProps<typeof badgeVariants>;\\n\\nfunction Badge({ className, variant, asChild, ...props }: BadgeProps) {\\n  const Component = asChild ? Slot.View : View;\\n  return (\\n    <TextClassContext.Provider value={badgeTextVariants({ variant })}>\\n      <Component className={cn(badgeVariants({ variant }), className)} {...props} />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nexport { Badge, badgeTextVariants, badgeVariants };\\nexport type { BadgeProps };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/button.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"button\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Button\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a button or a component that looks like a button.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/button.tsx\",\n      \"content\": \"import { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport { cva, type VariantProps } from 'class-variance-authority';\\nimport { Platform, Pressable } from 'react-native';\\n\\nconst buttonVariants = cva(\\n  cn(\\n    'group shrink-0 flex-row items-center justify-center gap-2 rounded-md shadow-none',\\n    Platform.select({\\n      web: \\\"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap outline-none transition-all focus-visible:ring-[3px] disabled:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\\\",\\n    })\\n  ),\\n  {\\n    variants: {\\n      variant: {\\n        default: cn(\\n          'bg-primary active:bg-primary/90 shadow-sm shadow-black/5',\\n          Platform.select({ web: 'hover:bg-primary/90' })\\n        ),\\n        destructive: cn(\\n          'bg-destructive active:bg-destructive/90 dark:bg-destructive/60 shadow-sm shadow-black/5',\\n          Platform.select({\\n            web: 'hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',\\n          })\\n        ),\\n        outline: cn(\\n          'border-border bg-background active:bg-accent dark:bg-input/30 dark:border-input dark:active:bg-input/50 border shadow-sm shadow-black/5',\\n          Platform.select({\\n            web: 'hover:bg-accent dark:hover:bg-input/50',\\n          })\\n        ),\\n        secondary: cn(\\n          'bg-secondary active:bg-secondary/80 shadow-sm shadow-black/5',\\n          Platform.select({ web: 'hover:bg-secondary/80' })\\n        ),\\n        ghost: cn(\\n          'active:bg-accent dark:active:bg-accent/50',\\n          Platform.select({ web: 'hover:bg-accent dark:hover:bg-accent/50' })\\n        ),\\n        link: '',\\n      },\\n      size: {\\n        default: cn('h-10 px-4 py-2 sm:h-9', Platform.select({ web: 'has-[>svg]:px-3' })),\\n        sm: cn('h-9 gap-1.5 rounded-md px-3 sm:h-8', Platform.select({ web: 'has-[>svg]:px-2.5' })),\\n        lg: cn('h-11 rounded-md px-6 sm:h-10', Platform.select({ web: 'has-[>svg]:px-4' })),\\n        icon: 'h-10 w-10 sm:h-9 sm:w-9',\\n      },\\n    },\\n    defaultVariants: {\\n      variant: 'default',\\n      size: 'default',\\n    },\\n  }\\n);\\n\\nconst buttonTextVariants = cva(\\n  cn(\\n    'text-foreground text-sm font-medium',\\n    Platform.select({ web: 'pointer-events-none transition-colors' })\\n  ),\\n  {\\n    variants: {\\n      variant: {\\n        default: 'text-primary-foreground',\\n        destructive: 'text-white',\\n        outline: cn(\\n          'group-active:text-accent-foreground',\\n          Platform.select({ web: 'group-hover:text-accent-foreground' })\\n        ),\\n        secondary: 'text-secondary-foreground',\\n        ghost: 'group-active:text-accent-foreground',\\n        link: cn(\\n          'text-primary group-active:underline',\\n          Platform.select({ web: 'underline-offset-4 hover:underline group-hover:underline' })\\n        ),\\n      },\\n      size: {\\n        default: '',\\n        sm: '',\\n        lg: '',\\n        icon: '',\\n      },\\n    },\\n    defaultVariants: {\\n      variant: 'default',\\n      size: 'default',\\n    },\\n  }\\n);\\n\\ntype ButtonProps = React.ComponentProps<typeof Pressable> &\\n  React.RefAttributes<typeof Pressable> &\\n  VariantProps<typeof buttonVariants>;\\n\\nfunction Button({ className, variant, size, ...props }: ButtonProps) {\\n  return (\\n    <TextClassContext.Provider value={buttonTextVariants({ variant, size })}>\\n      <Pressable\\n        className={cn(props.disabled && 'opacity-50', buttonVariants({ variant, size }), className)}\\n        role=\\\"button\\\"\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nexport { Button, buttonTextVariants, buttonVariants };\\nexport type { ButtonProps };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/card.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"card\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Card\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a card with header, content, and footer.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/card.tsx\",\n      \"content\": \"import { Text, TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport { View, type ViewProps } from 'react-native';\\n\\nfunction Card({ className, ...props }: ViewProps & React.RefAttributes<View>) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-card-foreground\\\">\\n      <View\\n        className={cn(\\n          'bg-card border-border flex flex-col gap-6 rounded-xl border py-6 shadow-sm shadow-black/5',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction CardHeader({ className, ...props }: ViewProps & React.RefAttributes<View>) {\\n  return <View className={cn('flex flex-col gap-1.5 px-6', className)} {...props} />;\\n}\\n\\nfunction CardTitle({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\\n  return (\\n    <Text\\n      role=\\\"heading\\\"\\n      aria-level={3}\\n      className={cn('font-semibold leading-none', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction CardDescription({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\\n  return <Text className={cn('text-muted-foreground text-sm', className)} {...props} />;\\n}\\n\\nfunction CardContent({ className, ...props }: ViewProps & React.RefAttributes<View>) {\\n  return <View className={cn('px-6', className)} {...props} />;\\n}\\n\\nfunction CardFooter({ className, ...props }: ViewProps & React.RefAttributes<View>) {\\n  return <View className={cn('flex flex-row items-center px-6', className)} {...props} />;\\n}\\n\\nexport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/checkbox.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"checkbox\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Checkbox\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A control that allows the user to toggle between checked and not checked.\",\n  \"dependencies\": [\n    \"@rn-primitives/checkbox\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/checkbox.tsx\",\n      \"content\": \"import { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as CheckboxPrimitive from '@rn-primitives/checkbox';\\nimport { Check } from 'lucide-react-native';\\nimport { Platform } from 'react-native';\\n\\nconst DEFAULT_HIT_SLOP = 24;\\n\\nfunction Checkbox({\\n  className,\\n  checkedClassName,\\n  indicatorClassName,\\n  iconClassName,\\n  ...props\\n}: CheckboxPrimitive.RootProps &\\n  React.RefAttributes<CheckboxPrimitive.RootRef> & {\\n    checkedClassName?: string;\\n    indicatorClassName?: string;\\n    iconClassName?: string;\\n  }) {\\n  return (\\n    <CheckboxPrimitive.Root\\n      className={cn(\\n        'border-input dark:bg-input/30 size-4 shrink-0 rounded-[4px] border shadow-sm shadow-black/5',\\n        Platform.select({\\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive peer cursor-default outline-none transition-shadow focus-visible:ring-[3px] disabled:cursor-not-allowed',\\n          native: 'overflow-hidden',\\n        }),\\n        props.checked && cn('border-primary', checkedClassName),\\n        props.disabled && 'opacity-50',\\n        className\\n      )}\\n      hitSlop={DEFAULT_HIT_SLOP}\\n      {...props}>\\n      <CheckboxPrimitive.Indicator\\n        className={cn('bg-primary h-full w-full items-center justify-center', indicatorClassName)}>\\n        <Icon\\n          as={Check}\\n          size={12}\\n          strokeWidth={Platform.OS === 'web' ? 2.5 : 3.5}\\n          className={cn('text-primary-foreground', iconClassName)}\\n        />\\n      </CheckboxPrimitive.Indicator>\\n    </CheckboxPrimitive.Root>\\n  );\\n}\\n\\nexport { Checkbox };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/collapsible.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"collapsible\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Collapsible\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A control that allows the user to toggle between checked and not checked.\",\n  \"dependencies\": [\n    \"@rn-primitives/collapsible\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/collapsible.tsx\",\n      \"content\": \"import * as CollapsiblePrimitive from '@rn-primitives/collapsible';\\n\\nconst Collapsible = CollapsiblePrimitive.Root;\\n\\nconst CollapsibleTrigger = CollapsiblePrimitive.Trigger;\\n\\nconst CollapsibleContent = CollapsiblePrimitive.Content;\\n\\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/context-menu.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"context-menu\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Context Menu\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a menu to the user — such as a set of actions or functions — triggered by a button.\",\n  \"dependencies\": [\n    \"@rn-primitives/context-menu\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\",\n    \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\",\n    \"https://reactnativereusables.com/r/nativewind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/context-menu.tsx\",\n      \"content\": \"import { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as ContextMenuPrimitive from '@rn-primitives/context-menu';\\nimport { Check, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport {\\n  Platform,\\n  type StyleProp,\\n  StyleSheet,\\n  Text,\\n  type TextProps,\\n  View,\\n  type ViewStyle,\\n} from 'react-native';\\nimport { FadeIn } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst ContextMenu = ContextMenuPrimitive.Root;\\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger;\\nconst ContextMenuGroup = ContextMenuPrimitive.Group;\\nconst ContextMenuSub = ContextMenuPrimitive.Sub;\\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;\\n\\nfunction ContextMenuSubTrigger({\\n  className,\\n  inset,\\n  children,\\n  iconClassName,\\n  ...props\\n}: ContextMenuPrimitive.SubTriggerProps &\\n  React.RefAttributes<ContextMenuPrimitive.SubTriggerRef> & {\\n    children?: React.ReactNode;\\n    iconClassName?: string;\\n    inset?: boolean;\\n  }) {\\n  const { open } = ContextMenuPrimitive.useSubContext();\\n  const icon = Platform.OS === 'web' ? ChevronRight : open ? ChevronUp : ChevronDown;\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm select-none group-active:text-accent-foreground',\\n        open && 'text-accent-foreground'\\n      )}>\\n      <ContextMenuPrimitive.SubTrigger\\n        className={cn(\\n          'active:bg-accent group flex flex-row items-center rounded-sm px-2 py-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none [&_svg]:pointer-events-none',\\n          }),\\n          className,\\n          open && cn('bg-accent', Platform.select({ native: 'mb-1' })),\\n          inset && 'pl-8'\\n        )}\\n        {...props}>\\n        <>{children}</>\\n        <Icon as={icon} className={cn('text-foreground ml-auto size-4 shrink-0', iconClassName)} />\\n      </ContextMenuPrimitive.SubTrigger>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction ContextMenuSubContent({\\n  className,\\n  ...props\\n}: ContextMenuPrimitive.SubContentProps & React.RefAttributes<ContextMenuPrimitive.SubContentRef>) {\\n  return (\\n    <NativeOnlyAnimatedView entering={FadeIn}>\\n      <ContextMenuPrimitive.SubContent\\n        className={cn(\\n          'bg-popover border-border overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\\n          Platform.select({\\n            web: 'animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fade-in-0 data-[state=closed]:zoom-out-95 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 origin-(--radix-context-menu-content-transform-origin) z-50 min-w-[8rem]',\\n          }),\\n          className\\n        )}\\n        {...props}\\n      />\\n    </NativeOnlyAnimatedView>\\n  );\\n}\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction ContextMenuContent({\\n  className,\\n  overlayClassName,\\n  overlayStyle,\\n  portalHost,\\n  ...props\\n}: ContextMenuPrimitive.ContentProps &\\n  React.RefAttributes<ContextMenuPrimitive.ContentRef> & {\\n    overlayStyle?: StyleProp<ViewStyle>;\\n    overlayClassName?: string;\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <ContextMenuPrimitive.Portal hostName={portalHost}>\\n      <FullWindowOverlay>\\n        <ContextMenuPrimitive.Overlay\\n          style={Platform.select({\\n            web: overlayStyle ?? undefined,\\n            native: overlayStyle\\n              ? StyleSheet.flatten([\\n                StyleSheet.absoluteFill,\\n                overlayStyle as typeof StyleSheet.absoluteFill,\\n              ])\\n              : StyleSheet.absoluteFill,\\n          })}\\n          className={overlayClassName}>\\n          <NativeOnlyAnimatedView entering={FadeIn}>\\n            <TextClassContext.Provider value=\\\"text-popover-foreground\\\">\\n              <ContextMenuPrimitive.Content\\n                className={cn(\\n                  'bg-popover border-border min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\\n                  Platform.select({\\n                    web: cn(\\n                      'animate-in fade-in-0 zoom-in-95 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) z-50 cursor-default',\\n                      props.side === 'bottom' && 'slide-in-from-top-2',\\n                      props.side === 'top' && 'slide-in-from-bottom-2'\\n                    ),\\n                  }),\\n                  className\\n                )}\\n                {...props}\\n              />\\n            </TextClassContext.Provider>\\n          </NativeOnlyAnimatedView>\\n        </ContextMenuPrimitive.Overlay>\\n      </FullWindowOverlay>\\n    </ContextMenuPrimitive.Portal>\\n  );\\n}\\n\\nfunction ContextMenuItem({\\n  className,\\n  inset,\\n  variant,\\n  ...props\\n}: ContextMenuPrimitive.ItemProps &\\n  React.RefAttributes<ContextMenuPrimitive.ItemRef> & {\\n    className?: string;\\n    inset?: boolean;\\n    variant?: 'default' | 'destructive';\\n  }) {\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'select-none text-sm text-popover-foreground group-active:text-popover-foreground',\\n        variant === 'destructive' && 'text-destructive group-active:text-destructive'\\n      )}>\\n      <ContextMenuPrimitive.Item\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm px-2 py-2 sm:py-1.5',\\n          Platform.select({\\n            web: cn(\\n              'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n              variant === 'destructive' && 'focus:bg-destructive/10 dark:focus:bg-destructive/20'\\n            ),\\n          }),\\n          variant === 'destructive' && 'active:bg-destructive/10 dark:active:bg-destructive/20',\\n          props.disabled && 'opacity-50',\\n          inset && 'pl-8',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction ContextMenuCheckboxItem({\\n  className,\\n  children,\\n  ...props\\n}: ContextMenuPrimitive.CheckboxItemProps &\\n  React.RefAttributes<ContextMenuPrimitive.CheckboxItemRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\\\">\\n      <ContextMenuPrimitive.CheckboxItem\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n          }),\\n          props.disabled && 'opacity-50',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\\\">\\n          <ContextMenuPrimitive.ItemIndicator>\\n            <Icon\\n              as={Check}\\n              className={cn(\\n                'text-foreground size-4',\\n                Platform.select({ web: 'pointer-events-none' })\\n              )}\\n            />\\n          </ContextMenuPrimitive.ItemIndicator>\\n        </View>\\n        <>{children}</>\\n      </ContextMenuPrimitive.CheckboxItem>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction ContextMenuRadioItem({\\n  className,\\n  children,\\n  ...props\\n}: ContextMenuPrimitive.RadioItemProps &\\n  React.RefAttributes<ContextMenuPrimitive.RadioItemRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\\\">\\n      <ContextMenuPrimitive.RadioItem\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n          }),\\n          props.disabled && 'opacity-50',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\\\">\\n          <ContextMenuPrimitive.ItemIndicator>\\n            <View className=\\\"bg-foreground h-2 w-2 rounded-full\\\" />\\n          </ContextMenuPrimitive.ItemIndicator>\\n        </View>\\n        <>{children}</>\\n      </ContextMenuPrimitive.RadioItem>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction ContextMenuLabel({\\n  className,\\n  inset,\\n  ...props\\n}: ContextMenuPrimitive.LabelProps &\\n  React.RefAttributes<ContextMenuPrimitive.LabelRef> & {\\n    className?: string;\\n    inset?: boolean;\\n  }) {\\n  return (\\n    <ContextMenuPrimitive.Label\\n      className={cn(\\n        'text-foreground px-2 py-2 text-sm font-medium sm:py-1.5',\\n        inset && 'pl-8',\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction ContextMenuSeparator({\\n  className,\\n  ...props\\n}: ContextMenuPrimitive.SeparatorProps & React.RefAttributes<ContextMenuPrimitive.SeparatorRef>) {\\n  return (\\n    <ContextMenuPrimitive.Separator\\n      className={cn('bg-border -mx-1 my-1 h-px', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction ContextMenuShortcut({ className, ...props }: TextProps & React.RefAttributes<Text>) {\\n  return (\\n    <Text\\n      className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport {\\n  ContextMenu,\\n  ContextMenuCheckboxItem,\\n  ContextMenuContent,\\n  ContextMenuGroup,\\n  ContextMenuItem,\\n  ContextMenuLabel,\\n  ContextMenuRadioGroup,\\n  ContextMenuRadioItem,\\n  ContextMenuSeparator,\\n  ContextMenuShortcut,\\n  ContextMenuSub,\\n  ContextMenuSubContent,\\n  ContextMenuSubTrigger,\\n  ContextMenuTrigger,\\n};\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/dialog.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dialog\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Dialog\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A window overlaid on either the primary window or another dialog window, rendering the content underneath inert.\",\n  \"dependencies\": [\n    \"@rn-primitives/dialog\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\",\n    \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\",\n    \"https://reactnativereusables.com/r/nativewind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/dialog.tsx\",\n      \"content\": \"import { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as DialogPrimitive from '@rn-primitives/dialog';\\nimport { X } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport { Platform, Text, View, type ViewProps } from 'react-native';\\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst Dialog = DialogPrimitive.Root;\\n\\nconst DialogTrigger = DialogPrimitive.Trigger;\\n\\nconst DialogPortal = DialogPrimitive.Portal;\\n\\nconst DialogClose = DialogPrimitive.Close;\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction DialogOverlay({\\n  className,\\n  children,\\n  ...props\\n}: Omit<DialogPrimitive.OverlayProps, 'asChild'> &\\n  React.RefAttributes<DialogPrimitive.OverlayRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <FullWindowOverlay>\\n      <DialogPrimitive.Overlay\\n        className={cn(\\n          'absolute bottom-0 left-0 right-0 top-0 flex items-center justify-center bg-black/50 p-2',\\n          Platform.select({\\n            web: 'animate-in fade-in-0 fixed cursor-default [&>*]:cursor-auto',\\n          }),\\n          className\\n        )}\\n        {...props}\\n        asChild={Platform.OS !== 'web'}>\\n        <NativeOnlyAnimatedView entering={FadeIn.duration(200)} exiting={FadeOut.duration(150)}>\\n          <NativeOnlyAnimatedView entering={FadeIn.delay(50)} exiting={FadeOut.duration(150)}>\\n            <>{children}</>\\n          </NativeOnlyAnimatedView>\\n        </NativeOnlyAnimatedView>\\n      </DialogPrimitive.Overlay>\\n    </FullWindowOverlay>\\n  );\\n}\\nfunction DialogContent({\\n  className,\\n  portalHost,\\n  children,\\n  ...props\\n}: DialogPrimitive.ContentProps &\\n  React.RefAttributes<DialogPrimitive.ContentRef> & {\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <DialogPortal hostName={portalHost}>\\n      <DialogOverlay>\\n        <DialogPrimitive.Content\\n          className={cn(\\n            'bg-background border-border z-50 mx-auto flex w-full max-w-[calc(100%-2rem)] flex-col gap-4 rounded-lg border p-6 shadow-lg shadow-black/5 sm:max-w-lg',\\n            Platform.select({\\n              web: 'animate-in fade-in-0 zoom-in-95 duration-200',\\n            }),\\n            className\\n          )}\\n          {...props}>\\n          <>{children}</>\\n          <DialogPrimitive.Close\\n            className={cn(\\n              'absolute right-4 top-4 rounded opacity-70 active:opacity-100',\\n              Platform.select({\\n                web: 'ring-offset-background focus:ring-ring data-[state=open]:bg-accent transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-offset-2',\\n              })\\n            )}\\n            hitSlop={12}>\\n            <Icon\\n              as={X}\\n              className={cn('text-accent-foreground web:pointer-events-none size-4 shrink-0')}\\n            />\\n            <Text className=\\\"sr-only\\\">Close</Text>\\n          </DialogPrimitive.Close>\\n        </DialogPrimitive.Content>\\n      </DialogOverlay>\\n    </DialogPortal>\\n  );\\n}\\n\\nfunction DialogHeader({ className, ...props }: ViewProps) {\\n  return (\\n    <View className={cn('flex flex-col gap-2 text-center sm:text-left', className)} {...props} />\\n  );\\n}\\n\\nfunction DialogFooter({ className, ...props }: ViewProps) {\\n  return (\\n    <View\\n      className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction DialogTitle({\\n  className,\\n  ...props\\n}: DialogPrimitive.TitleProps & React.RefAttributes<DialogPrimitive.TitleRef>) {\\n  return (\\n    <DialogPrimitive.Title\\n      className={cn('text-foreground text-lg font-semibold leading-none', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction DialogDescription({\\n  className,\\n  ...props\\n}: DialogPrimitive.DescriptionProps & React.RefAttributes<DialogPrimitive.DescriptionRef>) {\\n  return (\\n    <DialogPrimitive.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\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/dropdown-menu.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dropdown-menu\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Dropdown Menu\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a menu to the user — such as a set of actions or functions — triggered by a button.\",\n  \"dependencies\": [\n    \"@rn-primitives/dropdown-menu\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\",\n    \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\",\n    \"https://reactnativereusables.com/r/nativewind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/dropdown-menu.tsx\",\n      \"content\": \"import { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as DropdownMenuPrimitive from '@rn-primitives/dropdown-menu';\\nimport { Check, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport {\\n  Platform,\\n  type StyleProp,\\n  StyleSheet,\\n  Text,\\n  type TextProps,\\n  View,\\n  type ViewStyle,\\n} from 'react-native';\\nimport { FadeIn } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst DropdownMenu = DropdownMenuPrimitive.Root;\\n\\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\\n\\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\\n\\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\\n\\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\\n\\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\\n\\nfunction DropdownMenuSubTrigger({\\n  className,\\n  inset,\\n  children,\\n  iconClassName,\\n  ...props\\n}: DropdownMenuPrimitive.SubTriggerProps &\\n  React.RefAttributes<DropdownMenuPrimitive.SubTriggerRef> & {\\n    children?: React.ReactNode;\\n    iconClassName?: string;\\n    inset?: boolean;\\n  }) {\\n  const { open } = DropdownMenuPrimitive.useSubContext();\\n  const icon = Platform.OS === 'web' ? ChevronRight : open ? ChevronUp : ChevronDown;\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm select-none group-active:text-accent-foreground',\\n        open && 'text-accent-foreground'\\n      )}>\\n      <DropdownMenuPrimitive.SubTrigger\\n        className={cn(\\n          'active:bg-accent group flex flex-row items-center rounded-sm px-2 py-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none [&_svg]:pointer-events-none',\\n          }),\\n          className,\\n          open && 'bg-accent',\\n          inset && 'pl-8'\\n        )}\\n        {...props}>\\n        <>{children}</>\\n        <Icon as={icon} className={cn('text-foreground ml-auto size-4 shrink-0', iconClassName)} />\\n      </DropdownMenuPrimitive.SubTrigger>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction DropdownMenuSubContent({\\n  className,\\n  ...props\\n}: DropdownMenuPrimitive.SubContentProps &\\n  React.RefAttributes<DropdownMenuPrimitive.SubContentRef>) {\\n  return (\\n    <NativeOnlyAnimatedView entering={FadeIn}>\\n      <DropdownMenuPrimitive.SubContent\\n        className={cn(\\n          'bg-popover border-border overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\\n          Platform.select({\\n            web: 'animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fade-in-0 data-[state=closed]:zoom-out-95 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 origin-(--radix-context-menu-content-transform-origin) z-50 min-w-[8rem]',\\n          }),\\n          className\\n        )}\\n        {...props}\\n      />\\n    </NativeOnlyAnimatedView>\\n  );\\n}\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction DropdownMenuContent({\\n  className,\\n  overlayClassName,\\n  overlayStyle,\\n  portalHost,\\n  ...props\\n}: DropdownMenuPrimitive.ContentProps &\\n  React.RefAttributes<DropdownMenuPrimitive.ContentRef> & {\\n    overlayStyle?: StyleProp<ViewStyle>;\\n    overlayClassName?: string;\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <DropdownMenuPrimitive.Portal hostName={portalHost}>\\n      <FullWindowOverlay>\\n        <DropdownMenuPrimitive.Overlay\\n          style={Platform.select({\\n            web: overlayStyle ?? undefined,\\n            native: overlayStyle\\n              ? StyleSheet.flatten([\\n                StyleSheet.absoluteFill,\\n                overlayStyle as typeof StyleSheet.absoluteFill,\\n              ])\\n              : StyleSheet.absoluteFill,\\n          })}\\n          className={overlayClassName}>\\n          <NativeOnlyAnimatedView entering={FadeIn}>\\n            <TextClassContext.Provider value=\\\"text-popover-foreground\\\">\\n              <DropdownMenuPrimitive.Content\\n                className={cn(\\n                  'bg-popover border-border min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\\n                  Platform.select({\\n                    web: cn(\\n                      'animate-in fade-in-0 zoom-in-95 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) z-50 cursor-default',\\n                      props.side === 'bottom' && 'slide-in-from-top-2',\\n                      props.side === 'top' && 'slide-in-from-bottom-2'\\n                    ),\\n                  }),\\n                  className\\n                )}\\n                {...props}\\n              />\\n            </TextClassContext.Provider>\\n          </NativeOnlyAnimatedView>\\n        </DropdownMenuPrimitive.Overlay>\\n      </FullWindowOverlay>\\n    </DropdownMenuPrimitive.Portal>\\n  );\\n}\\n\\nfunction DropdownMenuItem({\\n  className,\\n  inset,\\n  variant,\\n  ...props\\n}: DropdownMenuPrimitive.ItemProps &\\n  React.RefAttributes<DropdownMenuPrimitive.ItemRef> & {\\n    className?: string;\\n    inset?: boolean;\\n    variant?: 'default' | 'destructive';\\n  }) {\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'select-none text-sm text-popover-foreground group-active:text-popover-foreground',\\n        variant === 'destructive' && 'text-destructive group-active:text-destructive'\\n      )}>\\n      <DropdownMenuPrimitive.Item\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm px-2 py-2 sm:py-1.5',\\n          Platform.select({\\n            web: cn(\\n              'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n              variant === 'destructive' && 'focus:bg-destructive/10 dark:focus:bg-destructive/20'\\n            ),\\n          }),\\n          variant === 'destructive' && 'active:bg-destructive/10 dark:active:bg-destructive/20',\\n          props.disabled && 'opacity-50',\\n          inset && 'pl-8',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction DropdownMenuCheckboxItem({\\n  className,\\n  children,\\n  ...props\\n}: DropdownMenuPrimitive.CheckboxItemProps &\\n  React.RefAttributes<DropdownMenuPrimitive.CheckboxItemRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\\\">\\n      <DropdownMenuPrimitive.CheckboxItem\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n          }),\\n          props.disabled && 'opacity-50',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\\\">\\n          <DropdownMenuPrimitive.ItemIndicator>\\n            <Icon\\n              as={Check}\\n              className={cn(\\n                'text-foreground size-4',\\n                Platform.select({ web: 'pointer-events-none' })\\n              )}\\n            />\\n          </DropdownMenuPrimitive.ItemIndicator>\\n        </View>\\n        <>{children}</>\\n      </DropdownMenuPrimitive.CheckboxItem>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction DropdownMenuRadioItem({\\n  className,\\n  children,\\n  ...props\\n}: DropdownMenuPrimitive.RadioItemProps &\\n  React.RefAttributes<DropdownMenuPrimitive.RadioItemRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\\\">\\n      <DropdownMenuPrimitive.RadioItem\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n          }),\\n          props.disabled && 'opacity-50',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\\\">\\n          <DropdownMenuPrimitive.ItemIndicator>\\n            <View className=\\\"bg-foreground h-2 w-2 rounded-full\\\" />\\n          </DropdownMenuPrimitive.ItemIndicator>\\n        </View>\\n        <>{children}</>\\n      </DropdownMenuPrimitive.RadioItem>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction DropdownMenuLabel({\\n  className,\\n  inset,\\n  ...props\\n}: DropdownMenuPrimitive.LabelProps &\\n  React.RefAttributes<DropdownMenuPrimitive.LabelRef> & {\\n    className?: string;\\n    inset?: boolean;\\n  }) {\\n  return (\\n    <DropdownMenuPrimitive.Label\\n      className={cn(\\n        'text-foreground px-2 py-2 text-sm font-medium sm:py-1.5',\\n        inset && 'pl-8',\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction DropdownMenuSeparator({\\n  className,\\n  ...props\\n}: DropdownMenuPrimitive.SeparatorProps & React.RefAttributes<DropdownMenuPrimitive.SeparatorRef>) {\\n  return (\\n    <DropdownMenuPrimitive.Separator\\n      className={cn('bg-border -mx-1 my-1 h-px', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction DropdownMenuShortcut({ className, ...props }: TextProps & React.RefAttributes<Text>) {\\n  return (\\n    <Text\\n      className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\\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\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/forgot-password-form-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"forgot-password-form-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"Forgot Password Form (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form that sends a password reset OTP to the user's email address with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/card.json\",\n    \"https://reactnativereusables.com/r/nativewind/input.json\",\n    \"https://reactnativereusables.com/r/nativewind/label.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/forgot-password-form.tsx\",\n      \"content\": \"import { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { useSignIn } from '@clerk/clerk-expo';\\nimport * as React from 'react';\\nimport { View } from 'react-native';\\n\\nexport function ForgotPasswordForm() {\\n  const [email, setEmail] = React.useState('');\\n  const { signIn, isLoaded } = useSignIn();\\n  const [error, setError] = React.useState<{ email?: string; password?: string }>({});\\n\\n  const onSubmit = async () => {\\n    if (!email) {\\n      setError({ email: 'Email is required' });\\n      return;\\n    }\\n    if (!isLoaded) {\\n      return;\\n    }\\n\\n    try {\\n      await signIn.create({\\n        strategy: 'reset_password_email_code',\\n        identifier: email,\\n      });\\n\\n      // TODO: Navigate to reset password screen\\n    } catch (err) {\\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\\n      if (err instanceof Error) {\\n        setError({ email: err.message });\\n        return;\\n      }\\n      console.error(JSON.stringify(err, null, 2));\\n    }\\n  };\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Forgot password?</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Enter your email to reset your password\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input\\n                id=\\\"email\\\"\\n                defaultValue={email}\\n                placeholder=\\\"m@example.com\\\"\\n                keyboardType=\\\"email-address\\\"\\n                autoComplete=\\\"email\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onChangeText={setEmail}\\n                onSubmitEditing={onSubmit}\\n                returnKeyType=\\\"send\\\"\\n              />\\n              {error.email ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.email}</Text>\\n              ) : null}\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Reset your password</Text>\\n            </Button>\\n          </View>\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/forgot-password-form.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"forgot-password-form\",\n  \"type\": \"registry:component\",\n  \"title\": \"Forgot Password Form\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form that sends a password reset OTP to the user's email address.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/card.json\",\n    \"https://reactnativereusables.com/r/nativewind/input.json\",\n    \"https://reactnativereusables.com/r/nativewind/label.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/forgot-password-form.tsx\",\n      \"content\": \"import { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { View } from 'react-native';\\n\\nexport function ForgotPasswordForm() {\\n  function onSubmit() {\\n    // TODO: Submit form and navigate to reset password screen if successful\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Forgot password?</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Enter your email to reset your password\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input\\n                id=\\\"email\\\"\\n                placeholder=\\\"m@example.com\\\"\\n                keyboardType=\\\"email-address\\\"\\n                autoComplete=\\\"email\\\"\\n                autoCapitalize=\\\"none\\\"\\n                returnKeyType=\\\"send\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Reset your password</Text>\\n            </Button>\\n          </View>\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/hover-card.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"hover-card\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Hover Card\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"For sighted users to preview content available behind a link.\",\n  \"dependencies\": [\n    \"@rn-primitives/hover-card\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\",\n    \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/hover-card.tsx\",\n      \"content\": \"import { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as HoverCardPrimitive from '@rn-primitives/hover-card';\\nimport * as React from 'react';\\nimport { Platform, StyleSheet } from 'react-native';\\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst HoverCard = HoverCardPrimitive.Root;\\n\\nconst HoverCardTrigger = HoverCardPrimitive.Trigger;\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction HoverCardContent({\\n  className,\\n  align = 'center',\\n  sideOffset = 4,\\n  ...props\\n}: HoverCardPrimitive.ContentProps & React.RefAttributes<HoverCardPrimitive.ContentRef>) {\\n  return (\\n    <HoverCardPrimitive.Portal>\\n      <FullWindowOverlay>\\n        <HoverCardPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\\n          <NativeOnlyAnimatedView entering={FadeIn} exiting={FadeOut}>\\n            <TextClassContext.Provider value=\\\"text-popover-foreground\\\">\\n              <HoverCardPrimitive.Content\\n                align={align}\\n                sideOffset={sideOffset}\\n                className={cn(\\n                  'bg-popover border-border outline-hidden z-50 w-64 rounded-md border p-4 shadow-md shadow-black/5',\\n                  Platform.select({\\n                    web: cn(\\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-hover-card-content-transform-origin) cursor-default [&>*]:cursor-auto',\\n                      props.side === 'bottom' && 'slide-in-from-top-2',\\n                      props.side === 'top' && 'slide-in-from-bottom-2'\\n                    ),\\n                  }),\\n                  className\\n                )}\\n                {...props}\\n              />\\n            </TextClassContext.Provider>\\n          </NativeOnlyAnimatedView>\\n        </HoverCardPrimitive.Overlay>\\n      </FullWindowOverlay>\\n    </HoverCardPrimitive.Portal>\\n  );\\n}\\n\\nexport { HoverCard, HoverCardContent, HoverCardTrigger };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/icon.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"icon\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Icon\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A component for displaying icons with consistent styling.\",\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/icon.tsx\",\n      \"content\": \"import { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport type { LucideIcon, LucideProps } from 'lucide-react-native';\\nimport { cssInterop } from 'nativewind';\\nimport * as React from 'react';\\n\\ntype IconProps = LucideProps & {\\n  as: LucideIcon;\\n};\\n\\nfunction IconImpl({ as: IconComponent, ...props }: IconProps) {\\n  return <IconComponent {...props} />;\\n}\\n\\ncssInterop(IconImpl, {\\n  className: {\\n    target: 'style',\\n    nativeStyleToProp: {\\n      height: 'size',\\n      width: 'size',\\n    },\\n  },\\n});\\n\\n/**\\n * A wrapper component for Lucide icons with Nativewind `className` support via `cssInterop`.\\n *\\n * This component allows you to render any Lucide icon while applying utility classes\\n * using `nativewind`. It avoids the need to wrap or configure each icon individually.\\n *\\n * @component\\n * @example\\n * ```tsx\\n * import { ArrowRight } from 'lucide-react-native';\\n * import { Icon } from '@/registry/components/ui/icon';\\n *\\n * <Icon as={ArrowRight} className=\\\"text-red-500\\\" size={16} />\\n * ```\\n *\\n * @param {LucideIcon} as - The Lucide icon component to render.\\n * @param {string} className - Utility classes to style the icon using Nativewind.\\n * @param {number} size - Icon size (defaults to 14).\\n * @param {...LucideProps} ...props - Additional Lucide icon props passed to the \\\"as\\\" icon.\\n */\\nfunction Icon({ as: IconComponent, className, size = 14, ...props }: IconProps) {\\n  const textClass = React.useContext(TextClassContext);\\n  return (\\n    <IconImpl\\n      as={IconComponent}\\n      className={cn('text-foreground', textClass, className)}\\n      size={size}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Icon };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/input.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"input\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Input\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a form input field or a component that looks like an input field.\",\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/input.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport { Platform, TextInput, type TextInputProps } from 'react-native';\\n\\nfunction Input({ className, ...props }: TextInputProps & React.RefAttributes<TextInput>) {\\n  return (\\n    <TextInput\\n      className={cn(\\n        'dark:bg-input/30 border-input bg-background text-foreground flex h-10 w-full min-w-0 flex-row items-center rounded-md border px-3 py-1 text-base leading-5 shadow-sm shadow-black/5 sm:h-9',\\n        props.editable === false &&\\n          cn(\\n            'opacity-50',\\n            Platform.select({ web: 'disabled:pointer-events-none disabled:cursor-not-allowed' })\\n          ),\\n        Platform.select({\\n          web: cn(\\n            'placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground outline-none transition-[color,box-shadow] md:text-sm',\\n            'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\\n            'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive'\\n          ),\\n          native: 'placeholder:text-muted-foreground/50',\\n        }),\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Input };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/label.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"label\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Label\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Renders an accessible label associated with controls.\",\n  \"dependencies\": [\n    \"@rn-primitives/label\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/label.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport * as LabelPrimitive from '@rn-primitives/label';\\nimport { Platform } from 'react-native';\\n\\nfunction Label({\\n  className,\\n  onPress,\\n  onLongPress,\\n  onPressIn,\\n  onPressOut,\\n  disabled,\\n  ...props\\n}: LabelPrimitive.TextProps & React.RefAttributes<LabelPrimitive.TextRef>) {\\n  return (\\n    <LabelPrimitive.Root\\n      className={cn(\\n        'flex select-none flex-row items-center gap-2',\\n        Platform.select({\\n          web: 'cursor-default leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-50 group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50',\\n        }),\\n        disabled && 'opacity-50'\\n      )}\\n      onPress={onPress}\\n      onLongPress={onLongPress}\\n      onPressIn={onPressIn}\\n      onPressOut={onPressOut}\\n      disabled={disabled}>\\n      <LabelPrimitive.Text\\n        className={cn(\\n          'text-foreground text-sm font-medium',\\n          Platform.select({ web: 'leading-none' }),\\n          className\\n        )}\\n        {...props}\\n      />\\n    </LabelPrimitive.Root>\\n  );\\n}\\n\\nexport { Label };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/menubar.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"menubar\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Menubar\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A visually persistent menu common in desktop applications that provides quick access to a consistent set of commands.\",\n  \"dependencies\": [\n    \"@rn-primitives/menubar\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\",\n    \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\",\n    \"https://reactnativereusables.com/r/nativewind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/menubar.tsx\",\n      \"content\": \"import { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as MenubarPrimitive from '@rn-primitives/menubar';\\nimport { Portal } from '@rn-primitives/portal';\\nimport { Check, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport {\\n  Platform,\\n  Pressable,\\n  type StyleProp,\\n  StyleSheet,\\n  Text,\\n  type TextProps,\\n  View,\\n  type ViewStyle,\\n} from 'react-native';\\nimport { FadeIn } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst MenubarMenu = MenubarPrimitive.Menu;\\n\\nconst MenubarGroup = MenubarPrimitive.Group;\\n\\nconst MenubarPortal = MenubarPrimitive.Portal;\\n\\nconst MenubarSub = MenubarPrimitive.Sub;\\n\\nconst MenubarRadioGroup = MenubarPrimitive.RadioGroup;\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction Menubar({\\n  className,\\n  value: valueProp,\\n  onValueChange: onValueChangeProp,\\n  ...props\\n}: MenubarPrimitive.RootProps & React.RefAttributes<MenubarPrimitive.RootRef>) {\\n  const id = React.useId();\\n  const [value, setValue] = React.useState<string | undefined>(undefined);\\n\\n  function closeMenu() {\\n    if (onValueChangeProp) {\\n      onValueChangeProp(undefined);\\n      return;\\n    }\\n    setValue(undefined);\\n  }\\n\\n  return (\\n    <>\\n      {Platform.OS !== 'web' && (value || valueProp) ? (\\n        <Portal name={`menubar-overlay-${id}`}>\\n          <Pressable onPress={closeMenu} style={StyleSheet.absoluteFill} />\\n        </Portal>\\n      ) : null}\\n      <MenubarPrimitive.Root\\n        className={cn(\\n          'bg-background border-border flex h-10 flex-row items-center gap-1 rounded-md border p-1 shadow-sm shadow-black/5 sm:h-9',\\n          className\\n        )}\\n        value={value ?? valueProp}\\n        onValueChange={onValueChangeProp ?? setValue}\\n        {...props}\\n      />\\n    </>\\n  );\\n}\\n\\nfunction MenubarTrigger({\\n  className,\\n  ...props\\n}: MenubarPrimitive.TriggerProps & React.RefAttributes<MenubarPrimitive.TriggerRef>) {\\n  const { value } = MenubarPrimitive.useRootContext();\\n  const { value: itemValue } = MenubarPrimitive.useMenuContext();\\n\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm font-medium select-none group-active:text-accent-foreground',\\n        value === itemValue && 'text-accent-foreground'\\n      )}>\\n      <MenubarPrimitive.Trigger\\n        className={cn(\\n          'group flex items-center rounded-md px-2 py-1.5 sm:py-1',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none',\\n          }),\\n          value === itemValue && 'bg-accent',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction MenubarSubTrigger({\\n  className,\\n  inset,\\n  children,\\n  iconClassName,\\n  ...props\\n}: MenubarPrimitive.SubTriggerProps &\\n  React.RefAttributes<MenubarPrimitive.SubTriggerRef> & {\\n    children?: React.ReactNode;\\n    iconClassName?: string;\\n    inset?: boolean;\\n  }) {\\n  const { open } = MenubarPrimitive.useSubContext();\\n  const icon = Platform.OS === 'web' ? ChevronRight : open ? ChevronUp : ChevronDown;\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm select-none group-active:text-accent-foreground',\\n        open && 'text-accent-foreground'\\n      )}>\\n      <MenubarPrimitive.SubTrigger\\n        className={cn(\\n          'active:bg-accent group flex flex-row items-center rounded-sm px-2 py-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none [&_svg]:pointer-events-none',\\n          }),\\n          className,\\n          open && 'bg-accent',\\n          inset && 'pl-8'\\n        )}\\n        {...props}>\\n        <>{children}</>\\n        <Icon as={icon} className={cn('text-foreground ml-auto size-4 shrink-0', iconClassName)} />\\n      </MenubarPrimitive.SubTrigger>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction MenubarSubContent({\\n  className,\\n  ...props\\n}: MenubarPrimitive.SubContentProps & React.RefAttributes<MenubarPrimitive.SubContentRef>) {\\n  return (\\n    <NativeOnlyAnimatedView entering={FadeIn}>\\n      <MenubarPrimitive.SubContent\\n        className={cn(\\n          'bg-popover border-border overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\\n          Platform.select({\\n            web: 'animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fade-in-0 data-[state=closed]:zoom-out-95 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 origin-(--radix-context-menu-content-transform-origin) z-50 min-w-[8rem]',\\n          }),\\n          className\\n        )}\\n        {...props}\\n      />\\n    </NativeOnlyAnimatedView>\\n  );\\n}\\n\\nfunction MenubarContent({\\n  className,\\n  portalHost,\\n  align = 'start',\\n  alignOffset = -4,\\n  sideOffset = 8,\\n  ...props\\n}: MenubarPrimitive.ContentProps &\\n  React.RefAttributes<MenubarPrimitive.ContentRef> & {\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <MenubarPrimitive.Portal hostName={portalHost}>\\n      <FullWindowOverlay>\\n        <NativeOnlyAnimatedView\\n          entering={FadeIn}\\n          style={StyleSheet.absoluteFill}\\n          pointerEvents=\\\"box-none\\\">\\n          <TextClassContext.Provider value=\\\"text-popover-foreground\\\">\\n            <MenubarPrimitive.Content\\n              className={cn(\\n                'bg-popover border-border min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\\n                Platform.select({\\n                  web: cn(\\n                    'animate-in fade-in-0 zoom-in-95 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) z-50 cursor-default',\\n                    props.side === 'bottom' && 'slide-in-from-top-2',\\n                    props.side === 'top' && 'slide-in-from-bottom-2'\\n                  ),\\n                }),\\n                className\\n              )}\\n              align={align}\\n              alignOffset={alignOffset}\\n              sideOffset={sideOffset}\\n              {...props}\\n            />\\n          </TextClassContext.Provider>\\n        </NativeOnlyAnimatedView>\\n      </FullWindowOverlay>\\n    </MenubarPrimitive.Portal>\\n  );\\n}\\n\\nfunction MenubarItem({\\n  className,\\n  inset,\\n  variant,\\n  ...props\\n}: MenubarPrimitive.ItemProps &\\n  React.RefAttributes<MenubarPrimitive.ItemRef> & {\\n    className?: string;\\n    inset?: boolean;\\n    variant?: 'default' | 'destructive';\\n  }) {\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'select-none text-sm text-popover-foreground group-active:text-popover-foreground',\\n        variant === 'destructive' && 'text-destructive group-active:text-destructive'\\n      )}>\\n      <MenubarPrimitive.Item\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm px-2 py-2 sm:py-1.5',\\n          Platform.select({\\n            web: cn(\\n              'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n              variant === 'destructive' && 'focus:bg-destructive/10 dark:focus:bg-destructive/20'\\n            ),\\n          }),\\n          variant === 'destructive' && 'active:bg-destructive/10 dark:active:bg-destructive/20',\\n          props.disabled && 'opacity-50',\\n          inset && 'pl-8',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction MenubarCheckboxItem({\\n  className,\\n  children,\\n  ...props\\n}: MenubarPrimitive.CheckboxItemProps &\\n  React.RefAttributes<MenubarPrimitive.CheckboxItemRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\\\">\\n      <MenubarPrimitive.CheckboxItem\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n          }),\\n          props.disabled && 'opacity-50',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\\\">\\n          <MenubarPrimitive.ItemIndicator>\\n            <Icon\\n              as={Check}\\n              className={cn(\\n                'text-foreground size-4',\\n                Platform.select({ web: 'pointer-events-none' })\\n              )}\\n            />\\n          </MenubarPrimitive.ItemIndicator>\\n        </View>\\n        <>{children}</>\\n      </MenubarPrimitive.CheckboxItem>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction MenubarRadioItem({\\n  className,\\n  children,\\n  ...props\\n}: MenubarPrimitive.RadioItemProps &\\n  React.RefAttributes<MenubarPrimitive.RadioItemRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\\\">\\n      <MenubarPrimitive.RadioItem\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n          }),\\n          props.disabled && 'opacity-50',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\\\">\\n          <MenubarPrimitive.ItemIndicator>\\n            <View className=\\\"bg-foreground h-2 w-2 rounded-full\\\" />\\n          </MenubarPrimitive.ItemIndicator>\\n        </View>\\n        <>{children}</>\\n      </MenubarPrimitive.RadioItem>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction MenubarLabel({\\n  className,\\n  inset,\\n  ...props\\n}: MenubarPrimitive.LabelProps &\\n  React.RefAttributes<MenubarPrimitive.LabelRef> & {\\n    className?: string;\\n    inset?: boolean;\\n  }) {\\n  return (\\n    <MenubarPrimitive.Label\\n      className={cn(\\n        'text-foreground px-2 py-2 text-sm font-medium sm:py-1.5',\\n        inset && 'pl-8',\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction MenubarSeparator({\\n  className,\\n  ...props\\n}: MenubarPrimitive.SeparatorProps & React.RefAttributes<MenubarPrimitive.SeparatorRef>) {\\n  return (\\n    <MenubarPrimitive.Separator className={cn('bg-border -mx-1 my-1 h-px', className)} {...props} />\\n  );\\n}\\n\\nfunction MenubarShortcut({ className, ...props }: TextProps & React.RefAttributes<Text>) {\\n  return (\\n    <Text\\n      className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport {\\n  Menubar,\\n  MenubarCheckboxItem,\\n  MenubarContent,\\n  MenubarGroup,\\n  MenubarItem,\\n  MenubarLabel,\\n  MenubarMenu,\\n  MenubarPortal,\\n  MenubarRadioGroup,\\n  MenubarRadioItem,\\n  MenubarSeparator,\\n  MenubarShortcut,\\n  MenubarSub,\\n  MenubarSubContent,\\n  MenubarSubTrigger,\\n  MenubarTrigger,\\n};\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/native-only-animated-view.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"native-only-animated-view\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Native Only Animated View\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A component that is only rendered and animated on native platforms.\",\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/native-only-animated-view.tsx\",\n      \"content\": \"import { Platform } from 'react-native';\\nimport Animated from 'react-native-reanimated';\\n\\n/**\\n * This component is used to wrap animated views that should only be animated on native.\\n * @param props - The props for the animated view.\\n * @returns The animated view if the platform is native, otherwise the children.\\n * @example\\n * <NativeOnlyAnimatedView entering={FadeIn} exiting={FadeOut}>\\n *   <Text>I am only animated on native</Text>\\n * </NativeOnlyAnimatedView>\\n */\\nfunction NativeOnlyAnimatedView(\\n  props: React.ComponentProps<typeof Animated.View> & React.RefAttributes<Animated.View>\\n) {\\n  if (Platform.OS === 'web') {\\n    return <>{props.children as React.ReactNode}</>;\\n  } else {\\n    return <Animated.View {...props} />;\\n  }\\n}\\n\\nexport { NativeOnlyAnimatedView };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/popover.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"popover\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Popover\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays rich content in a portal, triggered by a button.\",\n  \"dependencies\": [\n    \"@rn-primitives/popover\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\",\n    \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/popover.tsx\",\n      \"content\": \"import { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as PopoverPrimitive from '@rn-primitives/popover';\\nimport * as React from 'react';\\nimport { Platform, StyleSheet } from 'react-native';\\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst Popover = PopoverPrimitive.Root;\\n\\nconst PopoverTrigger = PopoverPrimitive.Trigger;\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction PopoverContent({\\n  className,\\n  align = 'center',\\n  sideOffset = 4,\\n  portalHost,\\n  ...props\\n}: PopoverPrimitive.ContentProps &\\n  React.RefAttributes<PopoverPrimitive.ContentRef> & {\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <PopoverPrimitive.Portal hostName={portalHost}>\\n      <FullWindowOverlay>\\n        <PopoverPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\\n          <NativeOnlyAnimatedView entering={FadeIn.duration(200)} exiting={FadeOut}>\\n            <TextClassContext.Provider value=\\\"text-popover-foreground\\\">\\n              <PopoverPrimitive.Content\\n                align={align}\\n                sideOffset={sideOffset}\\n                className={cn(\\n                  'bg-popover border-border outline-hidden z-50 w-72 rounded-md border p-4 shadow-md shadow-black/5',\\n                  Platform.select({\\n                    web: cn(\\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-popover-content-transform-origin) cursor-auto',\\n                      props.side === 'bottom' && 'slide-in-from-top-2',\\n                      props.side === 'top' && 'slide-in-from-bottom-2'\\n                    ),\\n                  }),\\n                  className\\n                )}\\n                {...props}\\n              />\\n            </TextClassContext.Provider>\\n          </NativeOnlyAnimatedView>\\n        </PopoverPrimitive.Overlay>\\n      </FullWindowOverlay>\\n    </PopoverPrimitive.Portal>\\n  );\\n}\\n\\nexport { Popover, PopoverContent, PopoverTrigger };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/progress.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"progress\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Progress\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.\",\n  \"dependencies\": [\n    \"@rn-primitives/progress\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/progress.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport * as ProgressPrimitive from '@rn-primitives/progress';\\nimport { Platform, View } from 'react-native';\\nimport Animated, {\\n  Extrapolation,\\n  interpolate,\\n  useAnimatedStyle,\\n  useDerivedValue,\\n  withSpring,\\n} from 'react-native-reanimated';\\n\\nfunction Progress({\\n  className,\\n  value,\\n  indicatorClassName,\\n  ...props\\n}: ProgressPrimitive.RootProps &\\n  React.RefAttributes<ProgressPrimitive.RootRef> & {\\n    indicatorClassName?: string;\\n  }) {\\n  return (\\n    <ProgressPrimitive.Root\\n      className={cn('bg-primary/20 relative h-2 w-full overflow-hidden rounded-full', className)}\\n      {...props}>\\n      <Indicator value={value} className={indicatorClassName} />\\n    </ProgressPrimitive.Root>\\n  );\\n}\\n\\nexport { Progress };\\n\\nconst Indicator = Platform.select({\\n  web: WebIndicator,\\n  native: NativeIndicator,\\n  default: NullIndicator,\\n});\\n\\ntype IndicatorProps = {\\n  value: number | undefined | null;\\n  className?: string;\\n};\\n\\nfunction WebIndicator({ value, className }: IndicatorProps) {\\n  if (Platform.OS !== 'web') {\\n    return null;\\n  }\\n\\n  return (\\n    <View\\n      className={cn('bg-primary h-full w-full flex-1 transition-all', className)}\\n      style={{ transform: `translateX(-${100 - (value ?? 0)}%)` }}>\\n      <ProgressPrimitive.Indicator className={cn('h-full w-full', className)} />\\n    </View>\\n  );\\n}\\n\\nfunction NativeIndicator({ value, className }: IndicatorProps) {\\n  const progress = useDerivedValue(() => value ?? 0);\\n\\n  const indicator = useAnimatedStyle(() => {\\n    return {\\n      width: withSpring(\\n        `${interpolate(progress.value, [0, 100], [1, 100], Extrapolation.CLAMP)}%`,\\n        { overshootClamping: true }\\n      ),\\n    };\\n  }, [value]);\\n\\n  if (Platform.OS === 'web') {\\n    return null;\\n  }\\n\\n  return (\\n    <ProgressPrimitive.Indicator asChild>\\n      <Animated.View style={indicator} className={cn('bg-foreground h-full', className)} />\\n    </ProgressPrimitive.Indicator>\\n  );\\n}\\n\\nfunction NullIndicator(_props: IndicatorProps) {\\n  return null;\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/radio-group.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"radio-group\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Radio Group\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A set of checkable buttons—known as radio buttons—where no more than one of the buttons can be checked at a time.\",\n  \"dependencies\": [\n    \"@rn-primitives/radio-group\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/radio-group.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport * as RadioGroupPrimitive from '@rn-primitives/radio-group';\\nimport { Platform } from 'react-native';\\n\\nfunction RadioGroup({\\n  className,\\n  ...props\\n}: RadioGroupPrimitive.RootProps & React.RefAttributes<RadioGroupPrimitive.RootRef>) {\\n  return <RadioGroupPrimitive.Root className={cn('gap-3', className)} {...props} />;\\n}\\n\\nfunction RadioGroupItem({\\n  className,\\n  ...props\\n}: RadioGroupPrimitive.ItemProps & React.RefAttributes<RadioGroupPrimitive.ItemRef>) {\\n  return (\\n    <RadioGroupPrimitive.Item\\n      className={cn(\\n        'border-input dark:bg-input/30 aspect-square size-4 shrink-0 items-center justify-center rounded-full border shadow-sm shadow-black/5',\\n        Platform.select({\\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive outline-none transition-all focus-visible:ring-[3px] disabled:cursor-not-allowed',\\n        }),\\n        props.disabled && 'opacity-50',\\n        className\\n      )}\\n      {...props}>\\n      <RadioGroupPrimitive.Indicator className=\\\"bg-primary size-2 rounded-full\\\" />\\n    </RadioGroupPrimitive.Item>\\n  );\\n}\\n\\nexport { RadioGroup, RadioGroupItem };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/reset-password-form-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"reset-password-form-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"Reset Password Form (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for resetting a password with an OTP sent via email with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/card.json\",\n    \"https://reactnativereusables.com/r/nativewind/input.json\",\n    \"https://reactnativereusables.com/r/nativewind/label.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/reset-password-form.tsx\",\n      \"content\": \"import { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { useSignIn } from '@clerk/clerk-expo';\\nimport * as React from 'react';\\nimport { TextInput, View } from 'react-native';\\n\\nexport function ResetPasswordForm() {\\n  const { signIn, setActive, isLoaded } = useSignIn();\\n  const [password, setPassword] = React.useState('');\\n  const [code, setCode] = React.useState('');\\n  const codeInputRef = React.useRef<TextInput>(null);\\n  const [error, setError] = React.useState({ code: '', password: '' });\\n\\n  async function onSubmit() {\\n    if (!isLoaded) {\\n      return;\\n    }\\n    try {\\n      const result = await signIn?.attemptFirstFactor({\\n        strategy: 'reset_password_email_code',\\n        code,\\n        password,\\n      });\\n\\n      if (result.status === 'complete') {\\n        // Set the active session to\\n        // the newly created session (user is now signed in)\\n        setActive({ session: result.createdSessionId });\\n        // TODO: If your app does not use `Stack.Protected`, navigate to your protected screen\\n        return;\\n      }\\n      // TODO: Handle other statuses\\n    } catch (err) {\\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\\n      if (err instanceof Error) {\\n        const isPasswordMessage = err.message.toLowerCase().includes('password');\\n        setError({ code: '', password: isPasswordMessage ? err.message : '' });\\n        return;\\n      }\\n      console.error(JSON.stringify(err, null, 2));\\n    }\\n  }\\n\\n  function onPasswordSubmitEditing() {\\n    codeInputRef.current?.focus();\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Reset password</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Enter the code sent to your email and set a new password\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <View className=\\\"flex-row items-center\\\">\\n                <Label htmlFor=\\\"password\\\">New password</Label>\\n              </View>\\n              <Input\\n                id=\\\"password\\\"\\n                secureTextEntry\\n                onChangeText={setPassword}\\n                returnKeyType=\\\"next\\\"\\n                submitBehavior=\\\"submit\\\"\\n                onSubmitEditing={onPasswordSubmitEditing}\\n              />\\n              {error.password ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.password}</Text>\\n              ) : null}\\n            </View>\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"code\\\">Verification code</Label>\\n              <Input\\n                id=\\\"code\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onChangeText={setCode}\\n                returnKeyType=\\\"send\\\"\\n                keyboardType=\\\"numeric\\\"\\n                autoComplete=\\\"sms-otp\\\"\\n                textContentType=\\\"oneTimeCode\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n              {error.code ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.code}</Text>\\n              ) : null}\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Reset Password</Text>\\n            </Button>\\n          </View>\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/reset-password-form.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"reset-password-form\",\n  \"type\": \"registry:component\",\n  \"title\": \"Reset Password Form\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for resetting a password with an OTP sent via email.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/card.json\",\n    \"https://reactnativereusables.com/r/nativewind/input.json\",\n    \"https://reactnativereusables.com/r/nativewind/label.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/reset-password-form.tsx\",\n      \"content\": \"import { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport * as React from 'react';\\nimport { TextInput, View } from 'react-native';\\n\\nexport function ResetPasswordForm() {\\n  const codeInputRef = React.useRef<TextInput>(null);\\n\\n  function onPasswordSubmitEditing() {\\n    codeInputRef.current?.focus();\\n  }\\n\\n  function onSubmit() {\\n    // TODO: Submit form and navigate to protected screen if successful\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Reset password</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Enter the code sent to your email and set a new password\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <View className=\\\"flex-row items-center\\\">\\n                <Label htmlFor=\\\"password\\\">New password</Label>\\n              </View>\\n              <Input\\n                id=\\\"password\\\"\\n                secureTextEntry\\n                returnKeyType=\\\"next\\\"\\n                submitBehavior=\\\"submit\\\"\\n                onSubmitEditing={onPasswordSubmitEditing}\\n              />\\n            </View>\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"code\\\">Verification code</Label>\\n              <Input\\n                id=\\\"code\\\"\\n                autoCapitalize=\\\"none\\\"\\n                returnKeyType=\\\"send\\\"\\n                keyboardType=\\\"numeric\\\"\\n                autoComplete=\\\"sms-otp\\\"\\n                textContentType=\\\"oneTimeCode\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Reset Password</Text>\\n            </Button>\\n          </View>\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/select.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"select\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Select\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a list of options for the user to pick from—triggered by a button.\",\n  \"dependencies\": [\n    \"@rn-primitives/select\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\",\n    \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\",\n    \"https://reactnativereusables.com/r/nativewind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/select.tsx\",\n      \"content\": \"import { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as SelectPrimitive from '@rn-primitives/select';\\nimport { Check, ChevronDown, ChevronDownIcon, ChevronUpIcon } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport { Platform, StyleSheet, View } from 'react-native';\\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\ntype Option = SelectPrimitive.Option;\\n\\nconst Select = SelectPrimitive.Root;\\n\\nconst SelectGroup = SelectPrimitive.Group;\\n\\nfunction SelectValue({\\n  ref,\\n  className,\\n  ...props\\n}: SelectPrimitive.ValueProps &\\n  React.RefAttributes<SelectPrimitive.ValueRef> & {\\n    className?: string;\\n  }) {\\n  const { value } = SelectPrimitive.useRootContext();\\n  return (\\n    <SelectPrimitive.Value\\n      ref={ref}\\n      className={cn(\\n        'text-foreground line-clamp-1 flex flex-row items-center gap-2 text-sm',\\n        !value && 'text-muted-foreground',\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction SelectTrigger({\\n  ref,\\n  className,\\n  children,\\n  size = 'default',\\n  ...props\\n}: SelectPrimitive.TriggerProps &\\n  React.RefAttributes<SelectPrimitive.TriggerRef> & {\\n    children?: React.ReactNode;\\n    size?: 'default' | 'sm';\\n  }) {\\n  return (\\n    <SelectPrimitive.Trigger\\n      ref={ref}\\n      className={cn(\\n        'border-input dark:bg-input/30 dark:active:bg-input/50 bg-background flex h-10 flex-row items-center justify-between gap-2 rounded-md border px-3 py-2 shadow-sm shadow-black/5 sm:h-9',\\n        Platform.select({\\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:hover:bg-input/50 w-fit whitespace-nowrap text-sm outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:shrink-0',\\n        }),\\n        props.disabled && 'opacity-50',\\n        size === 'sm' && 'h-8 py-2 sm:py-1.5',\\n        className\\n      )}\\n      {...props}>\\n      <>{children}</>\\n      <Icon as={ChevronDown} aria-hidden={true} className=\\\"text-muted-foreground size-4\\\" />\\n    </SelectPrimitive.Trigger>\\n  );\\n}\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction SelectContent({\\n  className,\\n  children,\\n  position = 'popper',\\n  portalHost,\\n  ...props\\n}: SelectPrimitive.ContentProps &\\n  React.RefAttributes<SelectPrimitive.ContentRef> & {\\n    className?: string;\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <SelectPrimitive.Portal hostName={portalHost}>\\n      <FullWindowOverlay>\\n        <SelectPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\\n          <TextClassContext.Provider value=\\\"text-popover-foreground\\\">\\n            <NativeOnlyAnimatedView className=\\\"z-50\\\" entering={FadeIn} exiting={FadeOut}>\\n              <SelectPrimitive.Content\\n                className={cn(\\n                  'bg-popover border-border relative z-50 min-w-[8rem] rounded-md border shadow-md shadow-black/5',\\n                  Platform.select({\\n                    web: cn(\\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-select-content-transform-origin) max-h-52 overflow-y-auto overflow-x-hidden',\\n                      props.side === 'bottom' && 'slide-in-from-top-2',\\n                      props.side === 'top' && 'slide-in-from-bottom-2'\\n                    ),\\n                    native: 'p-1',\\n                  }),\\n                  position === 'popper' &&\\n                  Platform.select({\\n                    web: cn(\\n                      props.side === 'bottom' && 'translate-y-1',\\n                      props.side === 'top' && '-translate-y-1'\\n                    ),\\n                  }),\\n                  className\\n                )}\\n                position={position}\\n                {...props}>\\n                <SelectScrollUpButton />\\n                <SelectPrimitive.Viewport\\n                  className={cn(\\n                    'p-1',\\n                    position === 'popper' &&\\n                    cn(\\n                      'w-full',\\n                      Platform.select({\\n                        web: 'h-[var(--radix-select-trigger-height)] min-w-[var(--radix-select-trigger-width)]',\\n                      })\\n                    )\\n                  )}>\\n                  {children}\\n                </SelectPrimitive.Viewport>\\n                <SelectScrollDownButton />\\n              </SelectPrimitive.Content>\\n            </NativeOnlyAnimatedView>\\n          </TextClassContext.Provider>\\n        </SelectPrimitive.Overlay>\\n      </FullWindowOverlay>\\n    </SelectPrimitive.Portal>\\n  );\\n}\\n\\nfunction SelectLabel({\\n  className,\\n  ...props\\n}: SelectPrimitive.LabelProps & React.RefAttributes<SelectPrimitive.LabelRef>) {\\n  return (\\n    <SelectPrimitive.Label\\n      className={cn('text-muted-foreground px-2 py-2 text-xs sm:py-1.5', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction SelectItem({\\n  className,\\n  children,\\n  ...props\\n}: SelectPrimitive.ItemProps & React.RefAttributes<SelectPrimitive.ItemRef>) {\\n  return (\\n    <SelectPrimitive.Item\\n      className={cn(\\n        'active:bg-accent group relative flex w-full flex-row items-center gap-2 rounded-sm py-2 pl-2 pr-8 sm:py-1.5',\\n        Platform.select({\\n          web: 'focus:bg-accent focus:text-accent-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 cursor-default outline-none data-[disabled]:pointer-events-none [&_svg]:pointer-events-none',\\n        }),\\n        props.disabled && 'opacity-50',\\n        className\\n      )}\\n      {...props}>\\n      <View className=\\\"absolute right-2 flex size-3.5 items-center justify-center\\\">\\n        <SelectPrimitive.ItemIndicator>\\n          <Icon as={Check} className=\\\"text-muted-foreground size-4 shrink-0\\\" />\\n        </SelectPrimitive.ItemIndicator>\\n      </View>\\n      <SelectPrimitive.ItemText className=\\\"text-foreground group-active:text-accent-foreground select-none text-sm\\\" />\\n    </SelectPrimitive.Item>\\n  );\\n}\\n\\nfunction SelectSeparator({\\n  className,\\n  ...props\\n}: SelectPrimitive.SeparatorProps & React.RefAttributes<SelectPrimitive.SeparatorRef>) {\\n  return (\\n    <SelectPrimitive.Separator\\n      className={cn(\\n        'bg-border -mx-1 my-1 h-px',\\n        Platform.select({ web: 'pointer-events-none' }),\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\n/**\\n * @platform Web only\\n * Returns null on native platforms\\n */\\nfunction SelectScrollUpButton({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\\n  if (Platform.OS !== 'web') {\\n    return null;\\n  }\\n  return (\\n    <SelectPrimitive.ScrollUpButton\\n      className={cn('flex cursor-default items-center justify-center py-1', className)}\\n      {...props}>\\n      <Icon as={ChevronUpIcon} className=\\\"size-4\\\" />\\n    </SelectPrimitive.ScrollUpButton>\\n  );\\n}\\n\\n/**\\n * @platform Web only\\n * Returns null on native platforms\\n */\\nfunction SelectScrollDownButton({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\\n  if (Platform.OS !== 'web') {\\n    return null;\\n  }\\n  return (\\n    <SelectPrimitive.ScrollDownButton\\n      className={cn('flex cursor-default items-center justify-center py-1', className)}\\n      {...props}>\\n      <Icon as={ChevronDownIcon} className=\\\"size-4\\\" />\\n    </SelectPrimitive.ScrollDownButton>\\n  );\\n}\\n\\n\\n\\nexport {\\n  Select,\\n  SelectContent,\\n  SelectGroup,\\n  SelectItem,\\n  SelectLabel,\\n  SelectScrollDownButton,\\n  SelectScrollUpButton,\\n  SelectSeparator,\\n  SelectTrigger,\\n  SelectValue,\\n  type Option,\\n};\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/separator.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"separator\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Separator\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Visually or semantically separates content.\",\n  \"dependencies\": [\n    \"@rn-primitives/separator\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/separator.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport * as SeparatorPrimitive from '@rn-primitives/separator';\\n\\nfunction Separator({\\n  className,\\n  orientation = 'horizontal',\\n  decorative = true,\\n  ...props\\n}: SeparatorPrimitive.RootProps & React.RefAttributes<SeparatorPrimitive.RootRef>) {\\n  return (\\n    <SeparatorPrimitive.Root\\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}\\n\\nexport { Separator };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/sign-in-form-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"sign-in-form-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"Sign In Form (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for signing in using email and password or social providers with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/card.json\",\n    \"https://reactnativereusables.com/r/nativewind/input.json\",\n    \"https://reactnativereusables.com/r/nativewind/label.json\",\n    \"https://reactnativereusables.com/r/nativewind/separator.json\",\n    \"https://reactnativereusables.com/r/nativewind/social-connections-clerk.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/sign-in-form.tsx\",\n      \"content\": \"import { SocialConnections } from '@/registry/blocks/social-connections';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Separator } from '@/registry/nativewind/components/ui/separator';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { useSignIn } from '@clerk/clerk-expo';\\nimport * as React from 'react';\\nimport { Pressable, type TextInput, View } from 'react-native';\\n\\nexport function SignInForm() {\\n  const { signIn, setActive, isLoaded } = useSignIn();\\n  const [email, setEmail] = React.useState('');\\n  const [password, setPassword] = React.useState('');\\n  const passwordInputRef = React.useRef<TextInput>(null);\\n  const [error, setError] = React.useState<{ email?: string; password?: string }>({});\\n\\n  async function onSubmit() {\\n    if (!isLoaded) {\\n      return;\\n    }\\n\\n    // Start the sign-in process using the email and password provided\\n    try {\\n      const signInAttempt = await signIn.create({\\n        identifier: email,\\n        password,\\n      });\\n\\n      // If sign-in process is complete, set the created session as active\\n      // and redirect the user\\n      if (signInAttempt.status === 'complete') {\\n        setError({ email: '', password: '' });\\n        await setActive({ session: signInAttempt.createdSessionId });\\n        // TODO: If your app does not use `Stack.Protected`, navigate to your protected screen\\n        return;\\n      }\\n      // TODO: Handle other statuses\\n      console.error(JSON.stringify(signInAttempt, null, 2));\\n    } catch (err) {\\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\\n      if (err instanceof Error) {\\n        const isEmailMessage =\\n          err.message.toLowerCase().includes('identifier') ||\\n          err.message.toLowerCase().includes('email');\\n        setError(isEmailMessage ? { email: err.message } : { password: err.message });\\n        return;\\n      }\\n      console.error(JSON.stringify(err, null, 2));\\n    }\\n  }\\n\\n  function onEmailSubmitEditing() {\\n    passwordInputRef.current?.focus();\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Sign in to your app</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Welcome back! Please sign in to continue\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input\\n                id=\\\"email\\\"\\n                placeholder=\\\"m@example.com\\\"\\n                keyboardType=\\\"email-address\\\"\\n                autoComplete=\\\"email\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onChangeText={setEmail}\\n                onSubmitEditing={onEmailSubmitEditing}\\n                returnKeyType=\\\"next\\\"\\n                submitBehavior=\\\"submit\\\"\\n              />\\n              {error.email ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.email}</Text>\\n              ) : null}\\n            </View>\\n            <View className=\\\"gap-1.5\\\">\\n              <View className=\\\"flex-row items-center\\\">\\n                <Label htmlFor=\\\"password\\\">Password</Label>\\n                <Button\\n                  variant=\\\"link\\\"\\n                  size=\\\"sm\\\"\\n                  className=\\\"web:h-fit ml-auto h-4 px-1 py-0 sm:h-4\\\"\\n                  onPress={() => {\\n                    // TODO: Navigate to forgot password screen\\n                  }}>\\n                  <Text className=\\\"font-normal leading-4\\\">Forgot your password?</Text>\\n                </Button>\\n              </View>\\n              <Input\\n                ref={passwordInputRef}\\n                id=\\\"password\\\"\\n                secureTextEntry\\n                onChangeText={setPassword}\\n                returnKeyType=\\\"send\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n              {error.password ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.password}</Text>\\n              ) : null}\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Continue</Text>\\n            </Button>\\n          </View>\\n          <Text className=\\\"text-center text-sm\\\">\\n            Don&apos;t have an account?{' '}\\n            <Pressable\\n              onPress={() => {\\n                // TODO: Navigate to sign up screen\\n              }}>\\n              <Text className=\\\"text-sm underline underline-offset-4\\\">Sign up</Text>\\n            </Pressable>\\n          </Text>\\n          <View className=\\\"flex-row items-center\\\">\\n            <Separator className=\\\"flex-1\\\" />\\n            <Text className=\\\"text-muted-foreground px-4 text-sm\\\">or</Text>\\n            <Separator className=\\\"flex-1\\\" />\\n          </View>\\n          <SocialConnections />\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/sign-in-form.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"sign-in-form\",\n  \"type\": \"registry:component\",\n  \"title\": \"Sign In Form\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for signing in using email and password or social providers.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/card.json\",\n    \"https://reactnativereusables.com/r/nativewind/input.json\",\n    \"https://reactnativereusables.com/r/nativewind/label.json\",\n    \"https://reactnativereusables.com/r/nativewind/separator.json\",\n    \"https://reactnativereusables.com/r/nativewind/social-connections.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/sign-in-form.tsx\",\n      \"content\": \"import { SocialConnections } from '@/registry/blocks/social-connections';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Separator } from '@/registry/nativewind/components/ui/separator';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport * as React from 'react';\\nimport { Pressable, type TextInput, View } from 'react-native';\\n\\nexport function SignInForm() {\\n  const passwordInputRef = React.useRef<TextInput>(null);\\n\\n  function onEmailSubmitEditing() {\\n    passwordInputRef.current?.focus();\\n  }\\n\\n  function onSubmit() {\\n    // TODO: Submit form and navigate to protected screen if successful\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Sign in to your app</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Welcome back! Please sign in to continue\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input\\n                id=\\\"email\\\"\\n                placeholder=\\\"m@example.com\\\"\\n                keyboardType=\\\"email-address\\\"\\n                autoComplete=\\\"email\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onSubmitEditing={onEmailSubmitEditing}\\n                returnKeyType=\\\"next\\\"\\n                submitBehavior=\\\"submit\\\"\\n              />\\n            </View>\\n            <View className=\\\"gap-1.5\\\">\\n              <View className=\\\"flex-row items-center\\\">\\n                <Label htmlFor=\\\"password\\\">Password</Label>\\n                <Button\\n                  variant=\\\"link\\\"\\n                  size=\\\"sm\\\"\\n                  className=\\\"web:h-fit ml-auto h-4 px-1 py-0 sm:h-4\\\"\\n                  onPress={() => {\\n                    // TODO: Navigate to forgot password screen\\n                  }}>\\n                  <Text className=\\\"font-normal leading-4\\\">Forgot your password?</Text>\\n                </Button>\\n              </View>\\n              <Input\\n                ref={passwordInputRef}\\n                id=\\\"password\\\"\\n                secureTextEntry\\n                returnKeyType=\\\"send\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Continue</Text>\\n            </Button>\\n          </View>\\n          <Text className=\\\"text-center text-sm\\\">\\n            Don&apos;t have an account?{' '}\\n            <Pressable\\n              onPress={() => {\\n                // TODO: Navigate to sign up screen\\n              }}>\\n              <Text className=\\\"text-sm underline underline-offset-4\\\">Sign up</Text>\\n            </Pressable>\\n          </Text>\\n          <View className=\\\"flex-row items-center\\\">\\n            <Separator className=\\\"flex-1\\\" />\\n            <Text className=\\\"text-muted-foreground px-4 text-sm\\\">or</Text>\\n            <Separator className=\\\"flex-1\\\" />\\n          </View>\\n          <SocialConnections />\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/sign-up-form-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"sign-up-form-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"Sign Up Form (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for creating an account with email and password or social providers with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/card.json\",\n    \"https://reactnativereusables.com/r/nativewind/input.json\",\n    \"https://reactnativereusables.com/r/nativewind/label.json\",\n    \"https://reactnativereusables.com/r/nativewind/separator.json\",\n    \"https://reactnativereusables.com/r/nativewind/social-connections-clerk.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/sign-up-form.tsx\",\n      \"content\": \"import { SocialConnections } from '@/registry/blocks/social-connections';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Separator } from '@/registry/nativewind/components/ui/separator';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { useSignUp } from '@clerk/clerk-expo';\\nimport * as React from 'react';\\nimport { Pressable, TextInput, View } from 'react-native';\\n\\nexport function SignUpForm() {\\n  const { signUp, isLoaded } = useSignUp();\\n  const [email, setEmail] = React.useState('');\\n  const [password, setPassword] = React.useState('');\\n  const passwordInputRef = React.useRef<TextInput>(null);\\n  const [error, setError] = React.useState<{ email?: string; password?: string }>({});\\n\\n  async function onSubmit() {\\n    if (!isLoaded) return;\\n\\n    // Start sign-up process using email and password provided\\n    try {\\n      await signUp.create({\\n        emailAddress: email,\\n        password,\\n      });\\n\\n      // Send user an email with verification code\\n      await signUp.prepareEmailAddressVerification({ strategy: 'email_code' });\\n\\n      // TODO: Navigate to verify email screen to capture OTP code\\n    } catch (err) {\\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\\n      if (err instanceof Error) {\\n        const isEmailMessage =\\n          err.message.toLowerCase().includes('identifier') ||\\n          err.message.toLowerCase().includes('email');\\n        setError(isEmailMessage ? { email: err.message } : { password: err.message });\\n        return;\\n      }\\n      console.error(JSON.stringify(err, null, 2));\\n    }\\n  }\\n\\n  function onEmailSubmitEditing() {\\n    passwordInputRef.current?.focus();\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Create your account</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Welcome! Please fill in the details to get started.\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input\\n                id=\\\"email\\\"\\n                placeholder=\\\"m@example.com\\\"\\n                keyboardType=\\\"email-address\\\"\\n                autoComplete=\\\"email\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onChangeText={setEmail}\\n                onSubmitEditing={onEmailSubmitEditing}\\n                returnKeyType=\\\"next\\\"\\n                submitBehavior=\\\"submit\\\"\\n              />\\n              {error.email ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.email}</Text>\\n              ) : null}\\n            </View>\\n            <View className=\\\"gap-1.5\\\">\\n              <View className=\\\"flex-row items-center\\\">\\n                <Label htmlFor=\\\"password\\\">Password</Label>\\n              </View>\\n              <Input\\n                ref={passwordInputRef}\\n                id=\\\"password\\\"\\n                secureTextEntry\\n                onChangeText={setPassword}\\n                returnKeyType=\\\"send\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n              {error.password ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.password}</Text>\\n              ) : null}\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Continue</Text>\\n            </Button>\\n          </View>\\n          <Text className=\\\"text-center text-sm\\\">\\n            Already have an account?{' '}\\n            <Pressable\\n              onPress={() => {\\n                // TODO: Navigate to sign in screen\\n              }}>\\n              <Text className=\\\"text-sm underline underline-offset-4\\\">Sign in</Text>\\n            </Pressable>\\n          </Text>\\n          <View className=\\\"flex-row items-center\\\">\\n            <Separator className=\\\"flex-1\\\" />\\n            <Text className=\\\"text-muted-foreground px-4 text-sm\\\">or</Text>\\n            <Separator className=\\\"flex-1\\\" />\\n          </View>\\n          <SocialConnections />\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/sign-up-form.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"sign-up-form\",\n  \"type\": \"registry:component\",\n  \"title\": \"Sign Up Form\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for creating an account with email and password or social providers.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/card.json\",\n    \"https://reactnativereusables.com/r/nativewind/input.json\",\n    \"https://reactnativereusables.com/r/nativewind/label.json\",\n    \"https://reactnativereusables.com/r/nativewind/separator.json\",\n    \"https://reactnativereusables.com/r/nativewind/social-connections.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/sign-up-form.tsx\",\n      \"content\": \"import { SocialConnections } from '@/registry/blocks/social-connections';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Separator } from '@/registry/nativewind/components/ui/separator';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport * as React from 'react';\\nimport { Pressable, TextInput, View } from 'react-native';\\n\\nexport function SignUpForm() {\\n  const passwordInputRef = React.useRef<TextInput>(null);\\n\\n  function onEmailSubmitEditing() {\\n    passwordInputRef.current?.focus();\\n  }\\n\\n  function onSubmit() {\\n    // TODO: Submit form and navigate to protected screen if successful\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Create your account</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Welcome! Please fill in the details to get started.\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input\\n                id=\\\"email\\\"\\n                placeholder=\\\"m@example.com\\\"\\n                keyboardType=\\\"email-address\\\"\\n                autoComplete=\\\"email\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onSubmitEditing={onEmailSubmitEditing}\\n                returnKeyType=\\\"next\\\"\\n                submitBehavior=\\\"submit\\\"\\n              />\\n            </View>\\n            <View className=\\\"gap-1.5\\\">\\n              <View className=\\\"flex-row items-center\\\">\\n                <Label htmlFor=\\\"password\\\">Password</Label>\\n              </View>\\n              <Input\\n                ref={passwordInputRef}\\n                id=\\\"password\\\"\\n                secureTextEntry\\n                returnKeyType=\\\"send\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Continue</Text>\\n            </Button>\\n          </View>\\n          <Text className=\\\"text-center text-sm\\\">\\n            Already have an account?{' '}\\n            <Pressable\\n              onPress={() => {\\n                // TODO: Navigate to sign in screen\\n              }}>\\n              <Text className=\\\"text-sm underline underline-offset-4\\\">Sign in</Text>\\n            </Pressable>\\n          </Text>\\n          <View className=\\\"flex-row items-center\\\">\\n            <Separator className=\\\"flex-1\\\" />\\n            <Text className=\\\"text-muted-foreground px-4 text-sm\\\">or</Text>\\n            <Separator className=\\\"flex-1\\\" />\\n          </View>\\n          <SocialConnections />\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/skeleton.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"skeleton\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Skeleton\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Use to show a placeholder while content is loading.\",\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/skeleton.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport { View } from 'react-native';\\n\\nfunction Skeleton({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof View> & React.RefAttributes<View>) {\\n  return <View className={cn('bg-accent animate-pulse rounded-md', className)} {...props} />;\\n}\\n\\nexport { Skeleton };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/social-connections-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"social-connections-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"Social Connections (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A set of buttons for authenticating through social providers with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\",\n    \"expo-auth-session\",\n    \"expo-web-browser\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/social-connections.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport { useSSO, type StartSSOFlowParams } from '@clerk/clerk-expo';\\nimport * as AuthSession from 'expo-auth-session';\\nimport * as WebBrowser from 'expo-web-browser';\\nimport { useColorScheme } from 'nativewind';\\nimport * as React from 'react';\\nimport { Image, Platform, View, type ImageSourcePropType } from 'react-native';\\n\\nWebBrowser.maybeCompleteAuthSession();\\n\\ntype SocialConnectionStrategy = Extract<\\n  StartSSOFlowParams['strategy'],\\n  'oauth_google' | 'oauth_github' | 'oauth_apple'\\n>;\\n\\nconst SOCIAL_CONNECTION_STRATEGIES: {\\n  type: SocialConnectionStrategy;\\n  source: ImageSourcePropType;\\n  useTint?: boolean;\\n}[] = [\\n  {\\n    type: 'oauth_apple',\\n    source: { uri: 'https://img.clerk.com/static/apple.png?width=160' },\\n    useTint: true,\\n  },\\n  {\\n    type: 'oauth_google',\\n    source: { uri: 'https://img.clerk.com/static/google.png?width=160' },\\n    useTint: false,\\n  },\\n  {\\n    type: 'oauth_github',\\n    source: { uri: 'https://img.clerk.com/static/github.png?width=160' },\\n    useTint: true,\\n  },\\n];\\n\\nexport function SocialConnections() {\\n  useWarmUpBrowser();\\n  const { colorScheme } = useColorScheme();\\n  const { startSSOFlow } = useSSO();\\n\\n  function onSocialLoginPress(strategy: SocialConnectionStrategy) {\\n    return async () => {\\n      try {\\n        // Start the authentication process by calling `startSSOFlow()`\\n        const { createdSessionId, setActive, signIn } = await startSSOFlow({\\n          strategy,\\n          // For web, defaults to current path\\n          // For native, you must pass a scheme, like AuthSession.makeRedirectUri({ scheme, path })\\n          // For more info, see https://docs.expo.dev/versions/latest/sdk/auth-session/#authsessionmakeredirecturioptions\\n          redirectUrl: AuthSession.makeRedirectUri(),\\n        });\\n\\n        // If sign in was successful, set the active session\\n        if (createdSessionId && setActive) {\\n          setActive({ session: createdSessionId });\\n          // TODO: If your app does not use `Stack.Protected`, redirect authenticated users to your protected screen\\n          return;\\n        }\\n\\n        // TODO: Handle other statuses\\n        // If there is no `createdSessionId`,\\n        // there are missing requirements, such as MFA\\n        // Use the `signIn` or `signUp` returned from `startSSOFlow`\\n        // to handle next steps\\n      } catch (err) {\\n        // See https://go.clerk.com/mRUDrIe for more info on error handling\\n        console.error(JSON.stringify(err, null, 2));\\n      }\\n    };\\n  }\\n\\n  return (\\n    <View className=\\\"gap-2 sm:flex-row sm:gap-3\\\">\\n      {SOCIAL_CONNECTION_STRATEGIES.map((strategy) => {\\n        return (\\n          <Button\\n            key={strategy.type}\\n            variant=\\\"outline\\\"\\n            size=\\\"sm\\\"\\n            className=\\\"sm:flex-1\\\"\\n            onPress={onSocialLoginPress(strategy.type)}>\\n            <Image\\n              className={cn('size-4', strategy.useTint && Platform.select({ web: 'dark:invert' }))}\\n              tintColor={Platform.select({\\n                native: strategy.useTint ? (colorScheme === 'dark' ? 'white' : 'black') : undefined,\\n              })}\\n              source={strategy.source}\\n            />\\n          </Button>\\n        );\\n      })}\\n    </View>\\n  );\\n}\\n\\nconst useWarmUpBrowser = Platform.select({\\n  web: () => {},\\n  default: () => {\\n    React.useEffect(() => {\\n      // Preloads the browser for Android devices to reduce authentication load time\\n      // See: https://docs.expo.dev/guides/authentication/#improving-user-experience\\n      void WebBrowser.warmUpAsync();\\n      return () => {\\n        // Cleanup: closes browser when component unmounts\\n        void WebBrowser.coolDownAsync();\\n      };\\n    }, []);\\n  },\\n});\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/social-connections.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"social-connections\",\n  \"type\": \"registry:component\",\n  \"title\": \"Social Connections\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A set of buttons for authenticating through social providers.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/social-connections.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport { useColorScheme } from 'nativewind';\\nimport { Image, Platform, View } from 'react-native';\\n\\nconst SOCIAL_CONNECTION_STRATEGIES = [\\n  {\\n    type: 'oauth_apple',\\n    source: { uri: 'https://img.clerk.com/static/apple.png?width=160' },\\n    useTint: true,\\n  },\\n  {\\n    type: 'oauth_google',\\n    source: { uri: 'https://img.clerk.com/static/google.png?width=160' },\\n    useTint: false,\\n  },\\n  {\\n    type: 'oauth_github',\\n    source: { uri: 'https://img.clerk.com/static/github.png?width=160' },\\n    useTint: true,\\n  },\\n];\\n\\nexport function SocialConnections() {\\n  const { colorScheme } = useColorScheme();\\n\\n  return (\\n    <View className=\\\"gap-2 sm:flex-row sm:gap-3\\\">\\n      {SOCIAL_CONNECTION_STRATEGIES.map((strategy) => {\\n        return (\\n          <Button\\n            key={strategy.type}\\n            variant=\\\"outline\\\"\\n            size=\\\"sm\\\"\\n            className=\\\"sm:flex-1\\\"\\n            onPress={() => {\\n              // TODO: Authenticate with social provider and navigate to protected screen if successful\\n            }}>\\n            <Image\\n              className={cn('size-4', strategy.useTint && Platform.select({ web: 'dark:invert' }))}\\n              tintColor={Platform.select({\\n                native: strategy.useTint ? (colorScheme === 'dark' ? 'white' : 'black') : undefined,\\n              })}\\n              source={strategy.source}\\n            />\\n          </Button>\\n        );\\n      })}\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/switch.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"switch\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Switch\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A control that allows the user to toggle between checked and not checked.\",\n  \"dependencies\": [\n    \"@rn-primitives/switch\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/switch.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport * as SwitchPrimitives from '@rn-primitives/switch';\\nimport { Platform } from 'react-native';\\n\\nfunction Switch({\\n  className,\\n  ...props\\n}: SwitchPrimitives.RootProps & React.RefAttributes<SwitchPrimitives.RootRef>) {\\n  return (\\n    <SwitchPrimitives.Root\\n      className={cn(\\n        'flex h-[1.15rem] w-8 shrink-0 flex-row items-center rounded-full border border-transparent shadow-sm shadow-black/5',\\n        Platform.select({\\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 peer inline-flex outline-none transition-all focus-visible:ring-[3px] disabled:cursor-not-allowed',\\n        }),\\n        props.checked ? 'bg-primary' : 'bg-input dark:bg-input/80',\\n        props.disabled && 'opacity-50',\\n        className\\n      )}\\n      {...props}>\\n      <SwitchPrimitives.Thumb\\n        className={cn(\\n          'bg-background size-4 rounded-full transition-transform',\\n          Platform.select({\\n            web: 'pointer-events-none block ring-0',\\n          }),\\n          props.checked\\n            ? 'dark:bg-primary-foreground translate-x-3.5'\\n            : 'dark:bg-foreground translate-x-0'\\n        )}\\n      />\\n    </SwitchPrimitives.Root>\\n  );\\n}\\n\\nexport { Switch };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/tabs.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"tabs\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Tabs\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A set of layered sections of content—known as tab panels—that are displayed one at a time.\",\n  \"dependencies\": [\n    \"@rn-primitives/tabs\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/tabs.tsx\",\n      \"content\": \"import { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as TabsPrimitive from '@rn-primitives/tabs';\\nimport { Platform } from 'react-native';\\n\\nfunction Tabs({\\n  className,\\n  ...props\\n}: TabsPrimitive.RootProps & React.RefAttributes<TabsPrimitive.RootRef>) {\\n  return <TabsPrimitive.Root className={cn('flex flex-col gap-2', className)} {...props} />;\\n}\\n\\nfunction TabsList({\\n  className,\\n  ...props\\n}: TabsPrimitive.ListProps & React.RefAttributes<TabsPrimitive.ListRef>) {\\n  return (\\n    <TabsPrimitive.List\\n      className={cn(\\n        'bg-muted flex h-9 flex-row items-center justify-center rounded-lg p-[3px]',\\n        Platform.select({ web: 'inline-flex w-fit', native: 'mr-auto' }),\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction TabsTrigger({\\n  className,\\n  ...props\\n}: TabsPrimitive.TriggerProps & React.RefAttributes<TabsPrimitive.TriggerRef>) {\\n  const { value } = TabsPrimitive.useRootContext();\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-foreground dark:text-muted-foreground text-sm font-medium',\\n        value === props.value && 'dark:text-foreground'\\n      )}>\\n      <TabsPrimitive.Trigger\\n        className={cn(\\n          'flex h-[calc(100%-1px)] flex-row items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 shadow-none shadow-black/5',\\n          Platform.select({\\n            web: 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring inline-flex cursor-default whitespace-nowrap transition-[color,box-shadow] focus-visible:outline-1 focus-visible:ring-[3px] disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0',\\n          }),\\n          props.disabled && 'opacity-50',\\n          props.value === value && 'bg-background dark:border-foreground/10 dark:bg-input/30',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction TabsContent({\\n  className,\\n  ...props\\n}: TabsPrimitive.ContentProps & React.RefAttributes<TabsPrimitive.ContentRef>) {\\n  return (\\n    <TabsPrimitive.Content\\n      className={cn(Platform.select({ web: 'flex-1 outline-none' }), className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Tabs, TabsContent, TabsList, TabsTrigger };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/text.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Text\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A component for displaying text.\",\n  \"dependencies\": [\n    \"@rn-primitives/slot\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport * as Slot from '@rn-primitives/slot';\\nimport { cva, type VariantProps } from 'class-variance-authority';\\nimport * as React from 'react';\\nimport { Platform, Text as RNText, type Role } from 'react-native';\\n\\nconst textVariants = cva(\\n  cn(\\n    'text-foreground text-base',\\n    Platform.select({\\n      web: 'select-text',\\n    })\\n  ),\\n  {\\n    variants: {\\n      variant: {\\n        default: '',\\n        h1: cn(\\n          'text-center text-4xl font-extrabold tracking-tight',\\n          Platform.select({ web: 'scroll-m-20 text-balance' })\\n        ),\\n        h2: cn(\\n          'border-border border-b pb-2 text-3xl font-semibold tracking-tight',\\n          Platform.select({ web: 'scroll-m-20 first:mt-0' })\\n        ),\\n        h3: cn('text-2xl font-semibold tracking-tight', Platform.select({ web: 'scroll-m-20' })),\\n        h4: cn('text-xl font-semibold tracking-tight', Platform.select({ web: 'scroll-m-20' })),\\n        p: 'mt-3 leading-7 sm:mt-6',\\n        blockquote: 'mt-4 border-l-2 pl-3 italic sm:mt-6 sm:pl-6',\\n        code: cn(\\n          'bg-muted relative rounded px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold'\\n        ),\\n        lead: 'text-muted-foreground text-xl',\\n        large: 'text-lg font-semibold',\\n        small: 'text-sm font-medium leading-none',\\n        muted: 'text-muted-foreground text-sm',\\n      },\\n    },\\n    defaultVariants: {\\n      variant: 'default',\\n    },\\n  }\\n);\\n\\ntype TextVariantProps = VariantProps<typeof textVariants>;\\n\\ntype TextVariant = NonNullable<TextVariantProps['variant']>;\\n\\nconst ROLE: Partial<Record<TextVariant, Role>> = {\\n  h1: 'heading',\\n  h2: 'heading',\\n  h3: 'heading',\\n  h4: 'heading',\\n  blockquote: Platform.select({ web: 'blockquote' as Role }),\\n  code: Platform.select({ web: 'code' as Role }),\\n};\\n\\nconst ARIA_LEVEL: Partial<Record<TextVariant, string>> = {\\n  h1: '1',\\n  h2: '2',\\n  h3: '3',\\n  h4: '4',\\n};\\n\\nconst TextClassContext = React.createContext<string | undefined>(undefined);\\n\\nfunction Text({\\n  className,\\n  asChild = false,\\n  variant = 'default',\\n  ...props\\n}: React.ComponentProps<typeof RNText> &\\n  TextVariantProps &\\n  React.RefAttributes<RNText> & {\\n    asChild?: boolean;\\n  }) {\\n  const textClass = React.useContext(TextClassContext);\\n  const Component = asChild ? Slot.Text : RNText;\\n  return (\\n    <Component\\n      className={cn(textVariants({ variant }), textClass, className)}\\n      role={variant ? ROLE[variant] : undefined}\\n      aria-level={variant ? ARIA_LEVEL[variant] : undefined}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Text, TextClassContext };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/textarea.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"textarea\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Textarea\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a form textarea or a component that looks like a textarea.\",\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/textarea.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport { Platform, TextInput, type TextInputProps } from 'react-native';\\n\\nfunction Textarea({\\n  className,\\n  multiline = true,\\n  numberOfLines = Platform.select({ web: 2, native: 8 }), // On web, numberOfLines also determines initial height. On native, it determines the maximum height.\\n  placeholderClassName,\\n  ...props\\n}: TextInputProps & React.RefAttributes<TextInput>) {\\n  return (\\n    <TextInput\\n      className={cn(\\n        'text-foreground border-input dark:bg-input/30 flex min-h-16 w-full flex-row rounded-md border bg-transparent px-3 py-2 text-base shadow-sm shadow-black/5 md:text-sm',\\n        Platform.select({\\n          web: 'placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive field-sizing-content resize-y outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed',\\n        }),\\n        props.editable === false && 'opacity-50',\\n        className\\n      )}\\n      placeholderClassName={cn('text-muted-foreground', placeholderClassName)}\\n      multiline={multiline}\\n      numberOfLines={numberOfLines}\\n      textAlignVertical=\\\"top\\\"\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Textarea };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/toggle-group.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"toggle-group\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Toggle Group\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A set of two-state buttons that can be toggled on or off.\",\n  \"dependencies\": [\n    \"@rn-primitives/toggle-group\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\",\n    \"https://reactnativereusables.com/r/nativewind/icon.json\",\n    \"https://reactnativereusables.com/r/nativewind/toggle.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/toggle-group.tsx\",\n      \"content\": \"import { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { toggleVariants } from '@/registry/nativewind/components/ui/toggle';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as ToggleGroupPrimitive from '@rn-primitives/toggle-group';\\nimport type { VariantProps } from 'class-variance-authority';\\nimport * as React from 'react';\\nimport { Platform } from 'react-native';\\n\\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants> | null>(null);\\n\\nfunction ToggleGroup({\\n  className,\\n  variant,\\n  size,\\n  children,\\n  ...props\\n}: ToggleGroupPrimitive.RootProps &\\n  VariantProps<typeof toggleVariants> &\\n  React.RefAttributes<ToggleGroupPrimitive.RootRef>) {\\n  return (\\n    <ToggleGroupPrimitive.Root\\n      className={cn(\\n        'flex flex-row items-center rounded-md shadow-none',\\n        Platform.select({ web: 'w-fit' }),\\n        variant === 'outline' && 'shadow-sm shadow-black/5',\\n        className\\n      )}\\n      {...props}>\\n      <ToggleGroupContext.Provider value={{ variant, size }}>\\n        {children}\\n      </ToggleGroupContext.Provider>\\n    </ToggleGroupPrimitive.Root>\\n  );\\n}\\n\\nfunction useToggleGroupContext() {\\n  const context = React.useContext(ToggleGroupContext);\\n  if (context === null) {\\n    throw new Error(\\n      'ToggleGroup compound components cannot be rendered outside the ToggleGroup component'\\n    );\\n  }\\n  return context;\\n}\\n\\nfunction ToggleGroupItem({\\n  className,\\n  children,\\n  variant,\\n  size,\\n  isFirst,\\n  isLast,\\n  ...props\\n}: ToggleGroupPrimitive.ItemProps &\\n  VariantProps<typeof toggleVariants> &\\n  React.RefAttributes<ToggleGroupPrimitive.ItemRef> & {\\n    isFirst?: boolean;\\n    isLast?: boolean;\\n  }) {\\n  const context = useToggleGroupContext();\\n  const { value } = ToggleGroupPrimitive.useRootContext();\\n\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm text-foreground font-medium',\\n        ToggleGroupPrimitive.utils.getIsSelected(value, props.value)\\n          ? 'text-accent-foreground'\\n          : Platform.select({ web: 'group-hover:text-muted-foreground' })\\n      )}>\\n      <ToggleGroupPrimitive.Item\\n        className={cn(\\n          toggleVariants({\\n            variant: context.variant || variant,\\n            size: context.size || size,\\n          }),\\n          props.disabled && 'opacity-50',\\n          ToggleGroupPrimitive.utils.getIsSelected(value, props.value) && 'bg-accent',\\n          'min-w-0 shrink-0 rounded-none shadow-none',\\n          isFirst && 'rounded-l-md',\\n          isLast && 'rounded-r-md',\\n          (context.variant === 'outline' || variant === 'outline') && 'border-l-0',\\n          (context.variant === 'outline' || variant === 'outline') && isFirst && 'border-l',\\n          Platform.select({\\n            web: 'flex-1 focus:z-10 focus-visible:z-10',\\n          }),\\n          className\\n        )}\\n        {...props}>\\n        {children}\\n      </ToggleGroupPrimitive.Item>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction ToggleGroupIcon({ className, ...props }: React.ComponentProps<typeof Icon>) {\\n  const textClass = React.useContext(TextClassContext);\\n  return <Icon className={cn('size-4 shrink-0', textClass, className)} {...props} />;\\n}\\n\\nexport { ToggleGroup, ToggleGroupIcon, ToggleGroupItem };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/toggle.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"toggle\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Toggle\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A two-state button that can be either on or off.\",\n  \"dependencies\": [\n    \"@rn-primitives/toggle\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\",\n    \"https://reactnativereusables.com/r/nativewind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/toggle.tsx\",\n      \"content\": \"import { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as TogglePrimitive from '@rn-primitives/toggle';\\nimport { cva, type VariantProps } from 'class-variance-authority';\\nimport * as React from 'react';\\nimport { Platform } from 'react-native';\\n\\nconst toggleVariants = cva(\\n  cn(\\n    'active:bg-muted group flex flex-row items-center justify-center gap-2 rounded-md',\\n    Platform.select({\\n      web: 'hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex cursor-default whitespace-nowrap outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:pointer-events-none [&_svg]:pointer-events-none',\\n    })\\n  ),\\n  {\\n    variants: {\\n      variant: {\\n        default: 'bg-transparent',\\n        outline: cn(\\n          'border-input active:bg-accent border bg-transparent shadow-sm shadow-black/5',\\n          Platform.select({\\n            web: 'hover:bg-accent hover:text-accent-foreground',\\n          })\\n        ),\\n      },\\n      size: {\\n        default: 'h-10 min-w-10 px-2.5 sm:h-9 sm:min-w-9 sm:px-2',\\n        sm: 'h-9 min-w-9 px-2 sm:h-8 sm:min-w-8 sm:px-1.5',\\n        lg: 'h-11 min-w-11 px-3 sm:h-10 sm:min-w-10 sm:px-2.5',\\n      },\\n    },\\n    defaultVariants: {\\n      variant: 'default',\\n      size: 'default',\\n    },\\n  }\\n);\\n\\nfunction Toggle({\\n  className,\\n  variant,\\n  size,\\n  ...props\\n}: TogglePrimitive.RootProps &\\n  VariantProps<typeof toggleVariants> &\\n  React.RefAttributes<TogglePrimitive.RootRef>) {\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm text-foreground font-medium',\\n        props.pressed\\n          ? 'text-accent-foreground'\\n          : Platform.select({ web: 'group-hover:text-muted-foreground' }),\\n        className\\n      )}>\\n      <TogglePrimitive.Root\\n        className={cn(\\n          toggleVariants({ variant, size }),\\n          props.disabled && 'opacity-50',\\n          props.pressed && 'bg-accent',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction ToggleIcon({ className, ...props }: React.ComponentProps<typeof Icon>) {\\n  const textClass = React.useContext(TextClassContext);\\n  return <Icon className={cn('size-4 shrink-0', textClass, className)} {...props} />;\\n}\\n\\nexport { Toggle, ToggleIcon, toggleVariants };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/tooltip.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"tooltip\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Tooltip\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A popup that displays information related to an element when the element receives keyboard focus, the mouse hovers over it, or when it is pressed.\",\n  \"dependencies\": [\n    \"@rn-primitives/tooltip\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/text.json\",\n    \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/tooltip.tsx\",\n      \"content\": \"import { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport * as TooltipPrimitive from '@rn-primitives/tooltip';\\nimport * as React from 'react';\\nimport { Platform, StyleSheet } from 'react-native';\\nimport { FadeInDown, FadeInUp, FadeOut } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst Tooltip = TooltipPrimitive.Root;\\n\\nconst TooltipTrigger = TooltipPrimitive.Trigger;\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction TooltipContent({\\n  className,\\n  sideOffset = 4,\\n  portalHost,\\n  side = 'top',\\n  ...props\\n}: TooltipPrimitive.ContentProps &\\n  React.RefAttributes<TooltipPrimitive.ContentRef> & {\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <TooltipPrimitive.Portal hostName={portalHost}>\\n      <FullWindowOverlay>\\n        <TooltipPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\\n          <NativeOnlyAnimatedView\\n            entering={\\n              side === 'top'\\n                ? FadeInDown.withInitialValues({ transform: [{ translateY: 3 }] }).duration(150)\\n                : FadeInUp.withInitialValues({ transform: [{ translateY: -5 }] })\\n            }\\n            exiting={FadeOut}>\\n            <TextClassContext.Provider value=\\\"text-xs text-primary-foreground\\\">\\n              <TooltipPrimitive.Content\\n                sideOffset={sideOffset}\\n                className={cn(\\n                  'bg-primary z-50 rounded-md px-3 py-2 sm:py-1.5',\\n                  Platform.select({\\n                    web: cn(\\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-tooltip-content-transform-origin) w-fit text-balance',\\n                      side === 'bottom' && 'slide-in-from-top-2',\\n                      side === 'left' && 'slide-in-from-right-2',\\n                      side === 'right' && 'slide-in-from-left-2',\\n                      side === 'top' && 'slide-in-from-bottom-2'\\n                    ),\\n                  }),\\n                  className\\n                )}\\n                side={side}\\n                {...props}\\n              />\\n            </TextClassContext.Provider>\\n          </NativeOnlyAnimatedView>\\n        </TooltipPrimitive.Overlay>\\n      </FullWindowOverlay>\\n    </TooltipPrimitive.Portal>\\n  );\\n}\\n\\nexport { Tooltip, TooltipContent, TooltipTrigger };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/user-menu-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"user-menu-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"User Menu (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A popover menu presenting options and actions for the current user with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/avatar.json\",\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/icon.json\",\n    \"https://reactnativereusables.com/r/nativewind/popover.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/user-menu.tsx\",\n      \"content\": \"import { Avatar, AvatarFallback, AvatarImage } from '@/registry/nativewind/components/ui/avatar';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport {\\n  Popover,\\n  PopoverContent,\\n  PopoverTrigger,\\n} from '@/registry/nativewind/components/ui/popover';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { useAuth, useUser } from '@clerk/clerk-expo';\\nimport type { TriggerRef } from '@rn-primitives/popover';\\nimport { LogOutIcon, PlusIcon, SettingsIcon } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport { View } from 'react-native';\\n\\nexport function UserMenu() {\\n  const { user } = useUser();\\n  const { signOut } = useAuth();\\n  const popoverTriggerRef = React.useRef<TriggerRef>(null);\\n\\n  async function onSignOut() {\\n    popoverTriggerRef.current?.close();\\n    await signOut();\\n    // TODO: If your app does not use `Stack.Protected`, navigate to your sign-in screen\\n  }\\n\\n  return (\\n    <Popover>\\n      <PopoverTrigger asChild ref={popoverTriggerRef}>\\n        <Button variant=\\\"ghost\\\" size=\\\"icon\\\" className=\\\"size-8 rounded-full\\\">\\n          <UserAvatar />\\n        </Button>\\n      </PopoverTrigger>\\n      <PopoverContent align=\\\"end\\\" side=\\\"bottom\\\" className=\\\"w-80 p-0\\\">\\n        <View className=\\\"border-border gap-3 border-b p-3\\\">\\n          <View className=\\\"flex-row items-center gap-3\\\">\\n            <UserAvatar className=\\\"size-10\\\" />\\n            <View className=\\\"flex-1\\\">\\n              <Text className=\\\"font-medium leading-5\\\">\\n                {user?.fullName || user?.emailAddresses[0]?.emailAddress}\\n              </Text>\\n              {user?.fullName?.length ? (\\n                <Text className=\\\"text-muted-foreground text-sm font-normal leading-4\\\">\\n                  {user?.username || user?.emailAddresses[0]?.emailAddress}\\n                </Text>\\n              ) : null}\\n            </View>\\n          </View>\\n          <View className=\\\"flex-row flex-wrap gap-3 py-0.5\\\">\\n            <Button\\n              variant=\\\"outline\\\"\\n              size=\\\"sm\\\"\\n              onPress={() => {\\n                // TODO: Navigate to account settings screen\\n              }}>\\n              <Icon as={SettingsIcon} className=\\\"size-4\\\" />\\n              <Text>Manage Account</Text>\\n            </Button>\\n            <Button variant=\\\"outline\\\" size=\\\"sm\\\" className=\\\"flex-1\\\" onPress={onSignOut}>\\n              <Icon as={LogOutIcon} className=\\\"size-4\\\" />\\n              <Text>Sign Out</Text>\\n            </Button>\\n          </View>\\n        </View>\\n        <Button\\n          variant=\\\"ghost\\\"\\n          size=\\\"lg\\\"\\n          className=\\\"h-16 justify-start gap-3 rounded-none rounded-b-md px-3 sm:h-14\\\"\\n          onPress={() => {\\n            // TODO: Navigate to add account screen\\n          }}>\\n          <View className=\\\"size-10 items-center justify-center\\\">\\n            <View className=\\\"border-border bg-muted/50 size-7 items-center justify-center rounded-full border border-dashed\\\">\\n              <Icon as={PlusIcon} className=\\\"size-5\\\" />\\n            </View>\\n          </View>\\n          <Text>Add account</Text>\\n        </Button>\\n      </PopoverContent>\\n    </Popover>\\n  );\\n}\\n\\nfunction UserAvatar(props: Omit<React.ComponentProps<typeof Avatar>, 'alt'>) {\\n  const { user } = useUser();\\n\\n  const { initials, imageSource, userName } = React.useMemo(() => {\\n    const userName = user?.fullName || user?.emailAddresses[0]?.emailAddress || 'Unknown';\\n    const initials = userName\\n      .split(' ')\\n      .map((name) => name[0])\\n      .join('');\\n\\n    const imageSource = user?.imageUrl ? { uri: user.imageUrl } : undefined;\\n    return { initials, imageSource, userName };\\n  }, [user?.imageUrl, user?.fullName, user?.emailAddresses[0]?.emailAddress]);\\n\\n  return (\\n    <Avatar alt={`${userName}'s avatar`} {...props}>\\n      <AvatarImage source={imageSource} />\\n      <AvatarFallback>\\n        <Text>{initials}</Text>\\n      </AvatarFallback>\\n    </Avatar>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/user-menu.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"user-menu\",\n  \"type\": \"registry:component\",\n  \"title\": \"User Menu\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A popover menu presenting options and actions for the current user.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/avatar.json\",\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/icon.json\",\n    \"https://reactnativereusables.com/r/nativewind/popover.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/user-menu.tsx\",\n      \"content\": \"import { Avatar, AvatarFallback, AvatarImage } from '@/registry/nativewind/components/ui/avatar';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport {\\n  Popover,\\n  PopoverContent,\\n  PopoverTrigger,\\n} from '@/registry/nativewind/components/ui/popover';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport type { TriggerRef } from '@rn-primitives/popover';\\nimport { LogOutIcon, PlusIcon, SettingsIcon } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport { View } from 'react-native';\\n\\nconst USER = {\\n  fullName: 'Zach Nugent',\\n  initials: 'ZN',\\n  imgSrc: { uri: 'https://github.com/mrzachnugent.png' },\\n  username: 'mrzachnugent',\\n};\\n\\nexport function UserMenu() {\\n  const popoverTriggerRef = React.useRef<TriggerRef>(null);\\n\\n  async function onSignOut() {\\n    popoverTriggerRef.current?.close();\\n    // TODO: Sign out and navigate to sign in screen\\n  }\\n\\n  return (\\n    <Popover>\\n      <PopoverTrigger asChild ref={popoverTriggerRef}>\\n        <Button variant=\\\"ghost\\\" size=\\\"icon\\\" className=\\\"size-8 rounded-full\\\">\\n          <UserAvatar />\\n        </Button>\\n      </PopoverTrigger>\\n      <PopoverContent align=\\\"center\\\" side=\\\"bottom\\\" className=\\\"w-80 p-0\\\">\\n        <View className=\\\"border-border gap-3 border-b p-3\\\">\\n          <View className=\\\"flex-row items-center gap-3\\\">\\n            <UserAvatar className=\\\"size-10\\\" />\\n            <View className=\\\"flex-1\\\">\\n              <Text className=\\\"font-medium leading-5\\\">{USER.fullName}</Text>\\n              {USER.fullName?.length ? (\\n                <Text className=\\\"text-muted-foreground text-sm font-normal leading-4\\\">\\n                  {USER.username}\\n                </Text>\\n              ) : null}\\n            </View>\\n          </View>\\n          <View className=\\\"flex-row flex-wrap gap-3 py-0.5\\\">\\n            <Button\\n              variant=\\\"outline\\\"\\n              size=\\\"sm\\\"\\n              onPress={() => {\\n                // TODO: Navigate to account settings screen\\n              }}>\\n              <Icon as={SettingsIcon} className=\\\"size-4\\\" />\\n              <Text>Manage Account</Text>\\n            </Button>\\n            <Button variant=\\\"outline\\\" size=\\\"sm\\\" className=\\\"flex-1\\\" onPress={onSignOut}>\\n              <Icon as={LogOutIcon} className=\\\"size-4\\\" />\\n              <Text>Sign Out</Text>\\n            </Button>\\n          </View>\\n        </View>\\n        <Button\\n          variant=\\\"ghost\\\"\\n          size=\\\"lg\\\"\\n          className=\\\"h-16 justify-start gap-3 rounded-none rounded-b-md px-3 sm:h-14\\\"\\n          onPress={() => {\\n            // TODO: Navigate to add account screen\\n          }}>\\n          <View className=\\\"size-10 items-center justify-center\\\">\\n            <View className=\\\"border-border bg-muted/50 size-7 items-center justify-center rounded-full border border-dashed\\\">\\n              <Icon as={PlusIcon} className=\\\"size-5\\\" />\\n            </View>\\n          </View>\\n          <Text>Add account</Text>\\n        </Button>\\n      </PopoverContent>\\n    </Popover>\\n  );\\n}\\n\\nfunction UserAvatar({ className, ...props }: Omit<React.ComponentProps<typeof Avatar>, 'alt'>) {\\n  return (\\n    <Avatar alt={`${USER.fullName}'s avatar`} className={cn('size-8', className)} {...props}>\\n      <AvatarImage source={USER.imgSrc} />\\n      <AvatarFallback>\\n        <Text>{USER.initials}</Text>\\n      </AvatarFallback>\\n    </Avatar>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/verify-email-form-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"verify-email-form-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"Verify Email Form (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for verifying an email address with an OTP sent via email with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/card.json\",\n    \"https://reactnativereusables.com/r/nativewind/input.json\",\n    \"https://reactnativereusables.com/r/nativewind/label.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/verify-email-form.tsx\",\n      \"content\": \"import { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { useSignUp } from '@clerk/clerk-expo';\\nimport * as React from 'react';\\nimport { type TextStyle, View } from 'react-native';\\n\\nconst RESEND_CODE_INTERVAL_SECONDS = 30;\\n\\nconst TABULAR_NUMBERS_STYLE: TextStyle = { fontVariant: ['tabular-nums'] };\\n\\nexport function VerifyEmailForm() {\\n  const { signUp, setActive, isLoaded } = useSignUp();\\n  const [code, setCode] = React.useState('');\\n  const [error, setError] = React.useState('');\\n  const { countdown, restartCountdown } = useCountdown(RESEND_CODE_INTERVAL_SECONDS);\\n\\n  async function onSubmit() {\\n    if (!isLoaded) return;\\n\\n    try {\\n      // Use the code the user provided to attempt verification\\n      const signUpAttempt = await signUp.attemptEmailAddressVerification({\\n        code,\\n      });\\n\\n      // If verification was completed, set the session to active\\n      // and redirect the user\\n      if (signUpAttempt.status === 'complete') {\\n        await setActive({ session: signUpAttempt.createdSessionId });\\n        // TODO: Redirect authenticated users to your protected screen\\n        return;\\n      }\\n      // TODO: Handle other statuses\\n      // If the status is not complete, check why. User may need to\\n      // complete further steps.\\n      console.error(JSON.stringify(signUpAttempt, null, 2));\\n    } catch (err) {\\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\\n      if (err instanceof Error) {\\n        setError(err.message);\\n        return;\\n      }\\n      console.error(JSON.stringify(err, null, 2));\\n    }\\n  }\\n\\n  async function onResendCode() {\\n    if (!isLoaded) return;\\n\\n    try {\\n      await signUp.prepareEmailAddressVerification({ strategy: 'email_code' });\\n      restartCountdown();\\n    } catch (err) {\\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\\n      if (err instanceof Error) {\\n        setError(err.message);\\n        return;\\n      }\\n      console.error(JSON.stringify(err, null, 2));\\n    }\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Verify your email</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Enter the verification code sent to m@example.com\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"code\\\">Verification code</Label>\\n              <Input\\n                id=\\\"code\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onChangeText={setCode}\\n                returnKeyType=\\\"send\\\"\\n                keyboardType=\\\"numeric\\\"\\n                autoComplete=\\\"sms-otp\\\"\\n                textContentType=\\\"oneTimeCode\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n              {!error ? null : (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error}</Text>\\n              )}\\n              <Button variant=\\\"link\\\" size=\\\"sm\\\" disabled={countdown > 0} onPress={onResendCode}>\\n                <Text className=\\\"text-center text-xs\\\">\\n                  Didn&apos;t receive the code? Resend{' '}\\n                  {countdown > 0 ? (\\n                    <Text className=\\\"text-xs\\\" style={TABULAR_NUMBERS_STYLE}>\\n                      ({countdown})\\n                    </Text>\\n                  ) : null}\\n                </Text>\\n              </Button>\\n            </View>\\n            <View className=\\\"gap-3\\\">\\n              <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n                <Text>Continue</Text>\\n              </Button>\\n              <Button\\n                variant=\\\"link\\\"\\n                className=\\\"mx-auto\\\"\\n                onPress={() => {\\n                  // TODO: Navigate to sign up screen\\n                }}>\\n                <Text>Cancel</Text>\\n              </Button>\\n            </View>\\n          </View>\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\\nfunction useCountdown(seconds = 30) {\\n  const [countdown, setCountdown] = React.useState(seconds);\\n  const intervalRef = React.useRef<ReturnType<typeof setInterval> | null>(null);\\n\\n  const startCountdown = React.useCallback(() => {\\n    setCountdown(seconds);\\n\\n    if (intervalRef.current) {\\n      clearInterval(intervalRef.current);\\n    }\\n\\n    intervalRef.current = setInterval(() => {\\n      setCountdown((prev) => {\\n        if (prev <= 1) {\\n          if (intervalRef.current) {\\n            clearInterval(intervalRef.current);\\n            intervalRef.current = null;\\n          }\\n          return 0;\\n        }\\n        return prev - 1;\\n      });\\n    }, 1000);\\n  }, [seconds]);\\n\\n  React.useEffect(() => {\\n    startCountdown();\\n\\n    return () => {\\n      if (intervalRef.current) {\\n        clearInterval(intervalRef.current);\\n      }\\n    };\\n  }, [startCountdown]);\\n\\n  return { countdown, restartCountdown: startCountdown };\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/nativewind/verify-email-form.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"verify-email-form\",\n  \"type\": \"registry:component\",\n  \"title\": \"Verify Email Form\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for verifying an email address with an OTP sent via email.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/nativewind/button.json\",\n    \"https://reactnativereusables.com/r/nativewind/card.json\",\n    \"https://reactnativereusables.com/r/nativewind/input.json\",\n    \"https://reactnativereusables.com/r/nativewind/label.json\",\n    \"https://reactnativereusables.com/r/nativewind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/verify-email-form.tsx\",\n      \"content\": \"import { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport * as React from 'react';\\nimport { type TextStyle, View } from 'react-native';\\n\\nconst RESEND_CODE_INTERVAL_SECONDS = 30;\\n\\nconst TABULAR_NUMBERS_STYLE: TextStyle = { fontVariant: ['tabular-nums'] };\\n\\nexport function VerifyEmailForm() {\\n  const { countdown, restartCountdown } = useCountdown(RESEND_CODE_INTERVAL_SECONDS);\\n\\n  function onSubmit() {\\n    // TODO: Submit form and navigate to protected screen if successful\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border pb-4 shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Verify your email</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Enter the verification code sent to m@example.com\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"code\\\">Verification code</Label>\\n              <Input\\n                id=\\\"code\\\"\\n                autoCapitalize=\\\"none\\\"\\n                returnKeyType=\\\"send\\\"\\n                keyboardType=\\\"numeric\\\"\\n                autoComplete=\\\"sms-otp\\\"\\n                textContentType=\\\"oneTimeCode\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n              <Button\\n                variant=\\\"link\\\"\\n                size=\\\"sm\\\"\\n                disabled={countdown > 0}\\n                onPress={() => {\\n                  // TODO: Resend code\\n                  restartCountdown();\\n                }}>\\n                <Text className=\\\"text-center text-xs\\\">\\n                  Didn&apos;t receive the code? Resend{' '}\\n                  {countdown > 0 ? (\\n                    <Text className=\\\"text-xs\\\" style={TABULAR_NUMBERS_STYLE}>\\n                      ({countdown})\\n                    </Text>\\n                  ) : null}\\n                </Text>\\n              </Button>\\n            </View>\\n            <View className=\\\"gap-3\\\">\\n              <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n                <Text>Continue</Text>\\n              </Button>\\n              <Button\\n                variant=\\\"link\\\"\\n                className=\\\"mx-auto\\\"\\n                onPress={() => {\\n                  // TODO: Navigate to sign up screen\\n                }}>\\n                <Text>Cancel</Text>\\n              </Button>\\n            </View>\\n          </View>\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\\nfunction useCountdown(seconds = 30) {\\n  const [countdown, setCountdown] = React.useState(seconds);\\n  const intervalRef = React.useRef<ReturnType<typeof setInterval> | null>(null);\\n\\n  const startCountdown = React.useCallback(() => {\\n    setCountdown(seconds);\\n\\n    if (intervalRef.current) {\\n      clearInterval(intervalRef.current);\\n    }\\n\\n    intervalRef.current = setInterval(() => {\\n      setCountdown((prev) => {\\n        if (prev <= 1) {\\n          if (intervalRef.current) {\\n            clearInterval(intervalRef.current);\\n            intervalRef.current = null;\\n          }\\n          return 0;\\n        }\\n        return prev - 1;\\n      });\\n    }, 1000);\\n  }, [seconds]);\\n\\n  React.useEffect(() => {\\n    startCountdown();\\n\\n    return () => {\\n      if (intervalRef.current) {\\n        clearInterval(intervalRef.current);\\n      }\\n    };\\n  }, [startCountdown]);\\n\\n  return { countdown, restartCountdown: startCountdown };\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/accordion.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"accordion\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Accordion\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A vertically stacked set of interactive headings that each reveal a section of content.\",\n  \"dependencies\": [\n    \"@rn-primitives/accordion\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\",\n    \"https://reactnativereusables.com/r/uniwind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/accordion.tsx\",\n      \"content\": \"import { Icon } from '@/registry/uniwind/components/ui/icon';\\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as AccordionPrimitive from '@rn-primitives/accordion';\\nimport { ChevronDown } from 'lucide-react-native';\\nimport { Platform, Pressable, View } from 'react-native';\\nimport Animated, {\\n  FadeOutUp,\\n  LayoutAnimationConfig,\\n  LinearTransition,\\n  useAnimatedStyle,\\n  useDerivedValue,\\n  withTiming,\\n} from 'react-native-reanimated';\\n\\nfunction Accordion({\\n  children,\\n  ...props\\n}: Omit<AccordionPrimitive.RootProps, 'asChild'> &\\n  React.RefAttributes<AccordionPrimitive.RootRef>) {\\n  return (\\n    <LayoutAnimationConfig skipEntering>\\n      <AccordionPrimitive.Root\\n        {...(props as AccordionPrimitive.RootProps)}\\n        asChild={Platform.OS !== 'web'}>\\n        <Animated.View layout={LinearTransition.duration(200)}>{children}</Animated.View>\\n      </AccordionPrimitive.Root>\\n    </LayoutAnimationConfig>\\n  );\\n}\\n\\nfunction AccordionItem({\\n  children,\\n  className,\\n  value,\\n  ...props\\n}: AccordionPrimitive.ItemProps & React.RefAttributes<AccordionPrimitive.ItemRef>) {\\n  return (\\n    <AccordionPrimitive.Item\\n      className={cn(\\n        'border-border border-b',\\n        Platform.select({ web: 'last:border-b-0' }),\\n        className\\n      )}\\n      value={value}\\n      asChild\\n      {...props}>\\n      <Animated.View\\n        className=\\\"native:overflow-hidden\\\"\\n        layout={Platform.select({ native: LinearTransition.duration(200) })}>\\n        {children}\\n      </Animated.View>\\n    </AccordionPrimitive.Item>\\n  );\\n}\\n\\nconst Trigger = Platform.OS === 'web' ? View : Pressable;\\n\\nfunction AccordionTrigger({\\n  className,\\n  children,\\n  ...props\\n}: AccordionPrimitive.TriggerProps & {\\n  children?: React.ReactNode;\\n} & React.RefAttributes<AccordionPrimitive.TriggerRef>) {\\n  const { isExpanded } = AccordionPrimitive.useItemContext();\\n\\n  const progress = useDerivedValue(\\n    () => (isExpanded ? withTiming(1, { duration: 250 }) : withTiming(0, { duration: 200 })),\\n    [isExpanded]\\n  );\\n  const chevronStyle = useAnimatedStyle(\\n    () => ({\\n      transform: [{ rotate: `${progress.value * 180}deg` }],\\n    }),\\n    [progress]\\n  );\\n\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-left text-sm font-medium',\\n        Platform.select({ web: 'group-hover:underline' })\\n      )}>\\n      <AccordionPrimitive.Header>\\n        <AccordionPrimitive.Trigger {...props} asChild={Platform.OS !== 'web'}>\\n          <Trigger\\n            className={cn(\\n              'flex-row items-start justify-between gap-4 rounded-md py-4 disabled:opacity-50',\\n              Platform.select({\\n                web: 'focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 outline-none transition-all hover:underline focus-visible:ring-[3px] disabled:pointer-events-none [&[data-state=open]>svg]:rotate-180',\\n              }),\\n              className\\n            )}>\\n            <>{children}</>\\n            <Animated.View style={chevronStyle}>\\n              <Icon\\n                as={ChevronDown}\\n                size={16}\\n                className={cn(\\n                  'text-muted-foreground shrink-0',\\n                  Platform.select({\\n                    web: 'pointer-events-none translate-y-0.5 transition-transform duration-200',\\n                  })\\n                )}\\n              />\\n            </Animated.View>\\n          </Trigger>\\n        </AccordionPrimitive.Trigger>\\n      </AccordionPrimitive.Header>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction AccordionContent({\\n  className,\\n  children,\\n  ...props\\n}: AccordionPrimitive.ContentProps & React.RefAttributes<AccordionPrimitive.ContentRef>) {\\n  const { isExpanded } = AccordionPrimitive.useItemContext();\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm\\\">\\n      <AccordionPrimitive.Content\\n        className={cn(\\n          'overflow-hidden',\\n          Platform.select({\\n            web: isExpanded ? 'animate-accordion-down' : 'animate-accordion-up',\\n          })\\n        )}\\n        {...props}>\\n        <Animated.View\\n          exiting={Platform.select({ native: FadeOutUp.duration(200) })}\\n          className={cn('pb-4', className)}>\\n          {children}\\n        </Animated.View>\\n      </AccordionPrimitive.Content>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/alert-dialog.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"alert-dialog\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Alert Dialog\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A modal dialog that interrupts the user with important content and expects a response.\",\n  \"dependencies\": [\n    \"@rn-primitives/alert-dialog\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/alert-dialog.tsx\",\n      \"content\": \"import { buttonTextVariants, buttonVariants } from '@/registry/uniwind/components/ui/button';\\nimport { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as AlertDialogPrimitive from '@rn-primitives/alert-dialog';\\nimport * as React from 'react';\\nimport { Platform, View, type ViewProps } from 'react-native';\\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst AlertDialog = AlertDialogPrimitive.Root;\\n\\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\\n\\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction AlertDialogOverlay({\\n  className,\\n  children,\\n  ...props\\n}: Omit<AlertDialogPrimitive.OverlayProps, 'asChild'> &\\n  React.RefAttributes<AlertDialogPrimitive.OverlayRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <FullWindowOverlay>\\n      <AlertDialogPrimitive.Overlay\\n        className={cn(\\n          'absolute bottom-0 left-0 right-0 top-0 z-50 flex items-center justify-center bg-black/50 p-2',\\n          Platform.select({\\n            web: 'animate-in fade-in-0 fixed',\\n          }),\\n          className\\n        )}\\n        {...props}>\\n        <NativeOnlyAnimatedView\\n          entering={FadeIn.duration(200).delay(50)}\\n          exiting={FadeOut.duration(150)}>\\n          <>{children}</>\\n        </NativeOnlyAnimatedView>\\n      </AlertDialogPrimitive.Overlay>\\n    </FullWindowOverlay>\\n  );\\n}\\n\\nfunction AlertDialogContent({\\n  className,\\n  portalHost,\\n  ...props\\n}: AlertDialogPrimitive.ContentProps &\\n  React.RefAttributes<AlertDialogPrimitive.ContentRef> & {\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <AlertDialogPortal hostName={portalHost}>\\n      <AlertDialogOverlay>\\n        <AlertDialogPrimitive.Content\\n          className={cn(\\n            'bg-background border-border z-50 flex flex-col gap-4 rounded-lg border p-6 shadow-lg shadow-black/5 sm:max-w-lg',\\n            Platform.select({\\n              web: 'animate-in fade-in-0 zoom-in-95 web:max-w-[calc(100%-2rem)] duration-200',\\n            }),\\n            className\\n          )}\\n          {...props}\\n        />\\n      </AlertDialogOverlay>\\n    </AlertDialogPortal>\\n  );\\n}\\n\\nfunction AlertDialogHeader({ className, ...props }: ViewProps) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-center sm:text-left\\\">\\n      <View className={cn('flex flex-col gap-2', className)} {...props} />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction AlertDialogFooter({ className, ...props }: ViewProps) {\\n  return (\\n    <View\\n      className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction AlertDialogTitle({\\n  className,\\n  ...props\\n}: AlertDialogPrimitive.TitleProps & React.RefAttributes<AlertDialogPrimitive.TitleRef>) {\\n  return (\\n    <AlertDialogPrimitive.Title\\n      className={cn('text-foreground text-lg font-semibold', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction AlertDialogDescription({\\n  className,\\n  ...props\\n}: AlertDialogPrimitive.DescriptionProps &\\n  React.RefAttributes<AlertDialogPrimitive.DescriptionRef>) {\\n  return (\\n    <AlertDialogPrimitive.Description\\n      className={cn('text-muted-foreground text-sm', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction AlertDialogAction({\\n  className,\\n  ...props\\n}: AlertDialogPrimitive.ActionProps & React.RefAttributes<AlertDialogPrimitive.ActionRef>) {\\n  return (\\n    <TextClassContext.Provider value={buttonTextVariants({ className })}>\\n      <AlertDialogPrimitive.Action className={cn(buttonVariants(), className)} {...props} />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction AlertDialogCancel({\\n  className,\\n  ...props\\n}: AlertDialogPrimitive.CancelProps & React.RefAttributes<AlertDialogPrimitive.CancelRef>) {\\n  return (\\n    <TextClassContext.Provider value={buttonTextVariants({ className, variant: 'outline' })}>\\n      <AlertDialogPrimitive.Cancel\\n        className={cn(buttonVariants({ variant: 'outline' }), className)}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nexport {\\n  AlertDialog,\\n  AlertDialogAction,\\n  AlertDialogCancel,\\n  AlertDialogContent,\\n  AlertDialogDescription,\\n  AlertDialogFooter,\\n  AlertDialogHeader,\\n  AlertDialogOverlay,\\n  AlertDialogPortal,\\n  AlertDialogTitle,\\n  AlertDialogTrigger,\\n};\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/alert.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"alert\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Alert\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a callout for user attention.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\",\n    \"https://reactnativereusables.com/r/uniwind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/alert.tsx\",\n      \"content\": \"import { Icon } from '@/registry/uniwind/components/ui/icon';\\nimport { Text, TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport type { LucideIcon } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport { View, type ViewProps } from 'react-native';\\n\\nfunction Alert({\\n  className,\\n  variant,\\n  children,\\n  icon,\\n  iconClassName,\\n  ...props\\n}: ViewProps &\\n  React.RefAttributes<View> & {\\n    icon: LucideIcon;\\n    variant?: 'default' | 'destructive';\\n    iconClassName?: string;\\n  }) {\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm text-foreground',\\n        variant === 'destructive' && 'text-destructive',\\n        className\\n      )}>\\n      <View\\n        role=\\\"alert\\\"\\n        className={cn(\\n          'bg-card border-border relative w-full rounded-lg border px-4 pb-2 pt-3.5',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-3.5 top-3\\\">\\n          <Icon\\n            as={icon}\\n            className={cn('size-4', variant === 'destructive' && 'text-destructive', iconClassName)}\\n          />\\n        </View>\\n        {children}\\n      </View>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction AlertTitle({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\\n  return (\\n    <Text\\n      className={cn('mb-1 ml-0.5 min-h-4 pl-6 font-medium leading-none tracking-tight', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction AlertDescription({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\\n  const textClass = React.useContext(TextClassContext);\\n  return (\\n    <Text\\n      className={cn(\\n        'text-muted-foreground ml-0.5 pb-1.5 pl-6 text-sm leading-relaxed',\\n        textClass?.includes('text-destructive') && 'text-destructive/90',\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Alert, AlertDescription, AlertTitle };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/aspect-ratio.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"aspect-ratio\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Aspect Ratio\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays content within a desired ratio.\",\n  \"dependencies\": [\n    \"@rn-primitives/aspect-ratio\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/aspect-ratio.tsx\",\n      \"content\": \"import * as AspectRatioPrimitive from '@rn-primitives/aspect-ratio';\\n\\nconst AspectRatio = AspectRatioPrimitive.Root;\\n\\nexport { AspectRatio };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/avatar.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"avatar\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Avatar\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"An image element with a fallback for representing the user.\",\n  \"dependencies\": [\n    \"@rn-primitives/avatar\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/avatar.tsx\",\n      \"content\": \"import { cn } from '@/registry/uniwind/lib/utils';\\nimport * as AvatarPrimitive from '@rn-primitives/avatar';\\n\\nfunction Avatar({\\n  className,\\n  ...props\\n}: AvatarPrimitive.RootProps & React.RefAttributes<AvatarPrimitive.RootRef>) {\\n  return (\\n    <AvatarPrimitive.Root\\n      className={cn('relative flex size-8 shrink-0 overflow-hidden rounded-full', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction AvatarImage({\\n  className,\\n  ...props\\n}: AvatarPrimitive.ImageProps & React.RefAttributes<AvatarPrimitive.ImageRef>) {\\n  return <AvatarPrimitive.Image className={cn('aspect-square size-full', className)} {...props} />;\\n}\\n\\nfunction AvatarFallback({\\n  className,\\n  ...props\\n}: AvatarPrimitive.FallbackProps & React.RefAttributes<AvatarPrimitive.FallbackRef>) {\\n  return (\\n    <AvatarPrimitive.Fallback\\n      className={cn(\\n        'bg-muted flex size-full flex-row items-center justify-center rounded-full',\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Avatar, AvatarFallback, AvatarImage };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/badge.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"badge\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Badge\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a badge or a component that looks like a badge.\",\n  \"dependencies\": [\n    \"@rn-primitives/slot\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/badge.tsx\",\n      \"content\": \"import { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as Slot from '@rn-primitives/slot';\\nimport { cva, type VariantProps } from 'class-variance-authority';\\nimport { Platform, View, ViewProps } from 'react-native';\\n\\nconst badgeVariants = cva(\\n  cn(\\n    'border-border group shrink-0 flex-row items-center justify-center gap-1 overflow-hidden rounded-full border px-2 py-0.5',\\n    Platform.select({\\n      web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive w-fit whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] [&>svg]:pointer-events-none [&>svg]:size-3',\\n    })\\n  ),\\n  {\\n    variants: {\\n      variant: {\\n        default: cn(\\n          'bg-primary border-transparent',\\n          Platform.select({ web: '[a&]:hover:bg-primary/90' })\\n        ),\\n        secondary: cn(\\n          'bg-secondary border-transparent',\\n          Platform.select({ web: '[a&]:hover:bg-secondary/90' })\\n        ),\\n        destructive: cn(\\n          'bg-destructive border-transparent',\\n          Platform.select({ web: '[a&]:hover:bg-destructive/90' })\\n        ),\\n        outline: Platform.select({ web: '[a&]:hover:bg-accent [a&]:hover:text-accent-foreground' }),\\n      },\\n    },\\n    defaultVariants: {\\n      variant: 'default',\\n    },\\n  }\\n);\\n\\nconst badgeTextVariants = cva('text-xs font-medium', {\\n  variants: {\\n    variant: {\\n      default: 'text-primary-foreground',\\n      secondary: 'text-secondary-foreground',\\n      destructive: 'text-white',\\n      outline: 'text-foreground',\\n    },\\n  },\\n  defaultVariants: {\\n    variant: 'default',\\n  },\\n});\\n\\ntype BadgeProps = ViewProps &\\n  React.RefAttributes<View> & {\\n    asChild?: boolean;\\n  } & VariantProps<typeof badgeVariants>;\\n\\nfunction Badge({ className, variant, asChild, ...props }: BadgeProps) {\\n  const Component = asChild ? Slot.View : View;\\n  return (\\n    <TextClassContext.Provider value={badgeTextVariants({ variant })}>\\n      <Component className={cn(badgeVariants({ variant }), className)} {...props} />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nexport { Badge, badgeTextVariants, badgeVariants };\\nexport type { BadgeProps };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/button.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"button\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Button\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a button or a component that looks like a button.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/button.tsx\",\n      \"content\": \"import { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport { cva, type VariantProps } from 'class-variance-authority';\\nimport { Platform, Pressable } from 'react-native';\\n\\n// NOTE: group-* is not supported yet by Uniwind\\n\\nconst buttonVariants = cva(\\n  cn(\\n    'group shrink-0 flex-row items-center justify-center gap-2 rounded-md shadow-none',\\n    Platform.select({\\n      web: \\\"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap outline-none transition-all focus-visible:ring-[3px] disabled:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\\\",\\n    })\\n  ),\\n  {\\n    variants: {\\n      variant: {\\n        default: cn(\\n          'bg-primary active:bg-primary/90 shadow-sm shadow-black/5',\\n          Platform.select({ web: 'hover:bg-primary/90' })\\n        ),\\n        destructive: cn(\\n          'bg-destructive active:bg-destructive/90 dark:bg-destructive/60 shadow-sm shadow-black/5',\\n          Platform.select({\\n            web: 'hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',\\n          })\\n        ),\\n        outline: cn(\\n          'border-border bg-background active:bg-accent dark:bg-input/30 dark:border-input dark:active:bg-input/50 border shadow-sm shadow-black/5',\\n          Platform.select({\\n            web: 'hover:bg-accent dark:hover:bg-input/50',\\n          })\\n        ),\\n        secondary: cn(\\n          'bg-secondary active:bg-secondary/80 shadow-sm shadow-black/5',\\n          Platform.select({ web: 'hover:bg-secondary/80' })\\n        ),\\n        ghost: cn(\\n          'active:bg-accent dark:active:bg-accent/50',\\n          Platform.select({ web: 'hover:bg-accent dark:hover:bg-accent/50' })\\n        ),\\n        link: '',\\n      },\\n      size: {\\n        default: cn('h-10 px-4 py-2 sm:h-9', Platform.select({ web: 'has-[>svg]:px-3' })),\\n        sm: cn('h-9 gap-1.5 rounded-md px-3 sm:h-8', Platform.select({ web: 'has-[>svg]:px-2.5' })),\\n        lg: cn('h-11 rounded-md px-6 sm:h-10', Platform.select({ web: 'has-[>svg]:px-4' })),\\n        icon: 'h-10 w-10 sm:h-9 sm:w-9',\\n      },\\n    },\\n    defaultVariants: {\\n      variant: 'default',\\n      size: 'default',\\n    },\\n  }\\n);\\n\\nconst buttonTextVariants = cva(\\n  cn(\\n    'text-foreground text-sm font-medium',\\n    Platform.select({ web: 'pointer-events-none transition-colors' })\\n  ),\\n  {\\n    variants: {\\n      variant: {\\n        default: 'text-primary-foreground',\\n        destructive: 'text-white',\\n        outline: cn(\\n          'group-active:text-accent-foreground',\\n          Platform.select({ web: 'group-hover:text-accent-foreground' })\\n        ),\\n        secondary: 'text-secondary-foreground',\\n        ghost: 'group-active:text-accent-foreground',\\n        link: cn(\\n          'text-primary group-active:underline',\\n          Platform.select({ web: 'underline-offset-4 hover:underline group-hover:underline' })\\n        ),\\n      },\\n      size: {\\n        default: '',\\n        sm: '',\\n        lg: '',\\n        icon: '',\\n      },\\n    },\\n    defaultVariants: {\\n      variant: 'default',\\n      size: 'default',\\n    },\\n  }\\n);\\n\\ntype ButtonProps = React.ComponentProps<typeof Pressable> &\\n  React.RefAttributes<typeof Pressable> &\\n  VariantProps<typeof buttonVariants>;\\n\\nfunction Button({ className, variant, size, ...props }: ButtonProps) {\\n  return (\\n    <TextClassContext.Provider value={buttonTextVariants({ variant, size })}>\\n      <Pressable\\n        className={cn(props.disabled && 'opacity-50', buttonVariants({ variant, size }), className)}\\n        role=\\\"button\\\"\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nexport { Button, buttonTextVariants, buttonVariants };\\nexport type { ButtonProps };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/card.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"card\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Card\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a card with header, content, and footer.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/card.tsx\",\n      \"content\": \"import { Text, TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport { View, type ViewProps } from 'react-native';\\n\\nfunction Card({ className, ...props }: ViewProps & React.RefAttributes<View>) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-card-foreground\\\">\\n      <View\\n        className={cn(\\n          'bg-card border-border flex flex-col gap-6 rounded-xl border py-6 shadow-sm shadow-black/5',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction CardHeader({ className, ...props }: ViewProps & React.RefAttributes<View>) {\\n  return <View className={cn('flex flex-col gap-1.5 px-6', className)} {...props} />;\\n}\\n\\nfunction CardTitle({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\\n  return (\\n    <Text\\n      role=\\\"heading\\\"\\n      aria-level={3}\\n      className={cn('font-semibold leading-none', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction CardDescription({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\\n  return <Text className={cn('text-muted-foreground text-sm', className)} {...props} />;\\n}\\n\\nfunction CardContent({ className, ...props }: ViewProps & React.RefAttributes<View>) {\\n  return <View className={cn('px-6', className)} {...props} />;\\n}\\n\\nfunction CardFooter({ className, ...props }: ViewProps & React.RefAttributes<View>) {\\n  return <View className={cn('flex flex-row items-center px-6', className)} {...props} />;\\n}\\n\\nexport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/checkbox.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"checkbox\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Checkbox\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A control that allows the user to toggle between checked and not checked.\",\n  \"dependencies\": [\n    \"@rn-primitives/checkbox\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/checkbox.tsx\",\n      \"content\": \"import { Icon } from '@/registry/uniwind/components/ui/icon';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as CheckboxPrimitive from '@rn-primitives/checkbox';\\nimport { Check } from 'lucide-react-native';\\nimport { Platform } from 'react-native';\\n\\nconst DEFAULT_HIT_SLOP = 24;\\n\\nfunction Checkbox({\\n  className,\\n  checkedClassName,\\n  indicatorClassName,\\n  iconClassName,\\n  ...props\\n}: CheckboxPrimitive.RootProps &\\n  React.RefAttributes<CheckboxPrimitive.RootRef> & {\\n    checkedClassName?: string;\\n    indicatorClassName?: string;\\n    iconClassName?: string;\\n  }) {\\n  return (\\n    <CheckboxPrimitive.Root\\n      className={cn(\\n        'border-input dark:bg-input/30 size-4 shrink-0 rounded-[4px] border shadow-sm shadow-black/5',\\n        Platform.select({\\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive peer cursor-default outline-none transition-shadow focus-visible:ring-[3px] disabled:cursor-not-allowed',\\n          native: 'overflow-hidden',\\n        }),\\n        props.checked && cn('border-primary', checkedClassName),\\n        props.disabled && 'opacity-50',\\n        className\\n      )}\\n      hitSlop={DEFAULT_HIT_SLOP}\\n      {...props}>\\n      <CheckboxPrimitive.Indicator\\n        className={cn('bg-primary h-full w-full items-center justify-center', indicatorClassName)}>\\n        <Icon\\n          as={Check}\\n          size={12}\\n          strokeWidth={Platform.OS === 'web' ? 2.5 : 3.5}\\n          className={cn('text-primary-foreground', iconClassName)}\\n        />\\n      </CheckboxPrimitive.Indicator>\\n    </CheckboxPrimitive.Root>\\n  );\\n}\\n\\nexport { Checkbox };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/collapsible.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"collapsible\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Collapsible\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A control that allows the user to toggle between checked and not checked.\",\n  \"dependencies\": [\n    \"@rn-primitives/collapsible\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/collapsible.tsx\",\n      \"content\": \"import * as CollapsiblePrimitive from '@rn-primitives/collapsible';\\n\\nconst Collapsible = CollapsiblePrimitive.Root;\\n\\nconst CollapsibleTrigger = CollapsiblePrimitive.Trigger;\\n\\nconst CollapsibleContent = CollapsiblePrimitive.Content;\\n\\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/context-menu.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"context-menu\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Context Menu\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a menu to the user — such as a set of actions or functions — triggered by a button.\",\n  \"dependencies\": [\n    \"@rn-primitives/context-menu\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\",\n    \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\",\n    \"https://reactnativereusables.com/r/uniwind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/context-menu.tsx\",\n      \"content\": \"import { Icon } from '@/registry/uniwind/components/ui/icon';\\nimport { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as ContextMenuPrimitive from '@rn-primitives/context-menu';\\nimport { Check, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport {\\n  Platform,\\n  type StyleProp,\\n  StyleSheet,\\n  Text,\\n  type TextProps,\\n  View,\\n  type ViewStyle,\\n} from 'react-native';\\nimport { FadeIn } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst ContextMenu = ContextMenuPrimitive.Root;\\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger;\\nconst ContextMenuGroup = ContextMenuPrimitive.Group;\\nconst ContextMenuSub = ContextMenuPrimitive.Sub;\\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;\\n\\nfunction ContextMenuSubTrigger({\\n  className,\\n  inset,\\n  children,\\n  iconClassName,\\n  ...props\\n}: ContextMenuPrimitive.SubTriggerProps &\\n  React.RefAttributes<ContextMenuPrimitive.SubTriggerRef> & {\\n    children?: React.ReactNode;\\n    iconClassName?: string;\\n    inset?: boolean;\\n  }) {\\n  const { open } = ContextMenuPrimitive.useSubContext();\\n  const icon = Platform.OS === 'web' ? ChevronRight : open ? ChevronUp : ChevronDown;\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm select-none group-active:text-accent-foreground',\\n        open && 'text-accent-foreground'\\n      )}>\\n      <ContextMenuPrimitive.SubTrigger\\n        className={cn(\\n          'active:bg-accent group flex flex-row items-center justify-between rounded-sm px-2 py-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none [&_svg]:pointer-events-none',\\n          }),\\n          className,\\n          open && cn('bg-accent', Platform.select({ native: 'mb-1' })),\\n          inset && 'pl-8'\\n        )}\\n        {...props}>\\n        <>{children}</>\\n        <Icon as={icon} className={cn('text-foreground size-4 shrink-0', iconClassName)} />\\n      </ContextMenuPrimitive.SubTrigger>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction ContextMenuSubContent({\\n  className,\\n  ...props\\n}: ContextMenuPrimitive.SubContentProps & React.RefAttributes<ContextMenuPrimitive.SubContentRef>) {\\n  return (\\n    <NativeOnlyAnimatedView entering={FadeIn}>\\n      <ContextMenuPrimitive.SubContent\\n        className={cn(\\n          'bg-popover border-border overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\\n          Platform.select({\\n            web: 'animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fade-in-0 data-[state=closed]:zoom-out-95 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 origin-(--radix-context-menu-content-transform-origin) z-50 min-w-[8rem]',\\n          }),\\n          className\\n        )}\\n        {...props}\\n      />\\n    </NativeOnlyAnimatedView>\\n  );\\n}\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction ContextMenuContent({\\n  className,\\n  overlayClassName,\\n  overlayStyle,\\n  portalHost,\\n  ...props\\n}: ContextMenuPrimitive.ContentProps &\\n  React.RefAttributes<ContextMenuPrimitive.ContentRef> & {\\n    overlayStyle?: StyleProp<ViewStyle>;\\n    overlayClassName?: string;\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <ContextMenuPrimitive.Portal hostName={portalHost}>\\n      <FullWindowOverlay>\\n        <ContextMenuPrimitive.Overlay\\n          style={Platform.select({\\n            web: overlayStyle ?? undefined,\\n            native: overlayStyle\\n              ? StyleSheet.flatten([\\n                StyleSheet.absoluteFill,\\n                overlayStyle as typeof StyleSheet.absoluteFill,\\n              ])\\n              : StyleSheet.absoluteFill,\\n          })}\\n          className={overlayClassName}>\\n          <NativeOnlyAnimatedView entering={FadeIn}>\\n            <TextClassContext.Provider value=\\\"text-popover-foreground\\\">\\n              <ContextMenuPrimitive.Content\\n                className={cn(\\n                  'bg-popover border-border min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\\n                  Platform.select({\\n                    web: cn(\\n                      'animate-in fade-in-0 zoom-in-95 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) z-50 cursor-default',\\n                      props.side === 'bottom' && 'slide-in-from-top-2',\\n                      props.side === 'top' && 'slide-in-from-bottom-2'\\n                    ),\\n                  }),\\n                  className\\n                )}\\n                {...props}\\n              />\\n            </TextClassContext.Provider>\\n          </NativeOnlyAnimatedView>\\n        </ContextMenuPrimitive.Overlay>\\n      </FullWindowOverlay>\\n    </ContextMenuPrimitive.Portal>\\n  );\\n}\\n\\nfunction ContextMenuItem({\\n  className,\\n  inset,\\n  variant,\\n  ...props\\n}: ContextMenuPrimitive.ItemProps &\\n  React.RefAttributes<ContextMenuPrimitive.ItemRef> & {\\n    className?: string;\\n    inset?: boolean;\\n    variant?: 'default' | 'destructive';\\n  }) {\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'select-none text-sm text-popover-foreground group-active:text-popover-foreground',\\n        variant === 'destructive' && 'text-destructive group-active:text-destructive'\\n      )}>\\n      <ContextMenuPrimitive.Item\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm px-2 py-2 sm:py-1.5',\\n          Platform.select({\\n            web: cn(\\n              'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n              variant === 'destructive' && 'focus:bg-destructive/10 dark:focus:bg-destructive/20'\\n            ),\\n          }),\\n          variant === 'destructive' && 'active:bg-destructive/10 dark:active:bg-destructive/20',\\n          props.disabled && 'opacity-50',\\n          inset && 'pl-8',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction ContextMenuCheckboxItem({\\n  className,\\n  children,\\n  ...props\\n}: ContextMenuPrimitive.CheckboxItemProps &\\n  React.RefAttributes<ContextMenuPrimitive.CheckboxItemRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\\\">\\n      <ContextMenuPrimitive.CheckboxItem\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n          }),\\n          props.disabled && 'opacity-50',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\\\">\\n          <ContextMenuPrimitive.ItemIndicator>\\n            <Icon\\n              as={Check}\\n              className={cn(\\n                'text-foreground size-4',\\n                Platform.select({ web: 'pointer-events-none' })\\n              )}\\n            />\\n          </ContextMenuPrimitive.ItemIndicator>\\n        </View>\\n        <>{children}</>\\n      </ContextMenuPrimitive.CheckboxItem>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction ContextMenuRadioItem({\\n  className,\\n  children,\\n  ...props\\n}: ContextMenuPrimitive.RadioItemProps &\\n  React.RefAttributes<ContextMenuPrimitive.RadioItemRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\\\">\\n      <ContextMenuPrimitive.RadioItem\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n          }),\\n          props.disabled && 'opacity-50',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\\\">\\n          <ContextMenuPrimitive.ItemIndicator>\\n            <View className=\\\"bg-foreground h-2 w-2 rounded-full\\\" />\\n          </ContextMenuPrimitive.ItemIndicator>\\n        </View>\\n        <>{children}</>\\n      </ContextMenuPrimitive.RadioItem>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction ContextMenuLabel({\\n  className,\\n  inset,\\n  ...props\\n}: ContextMenuPrimitive.LabelProps &\\n  React.RefAttributes<ContextMenuPrimitive.LabelRef> & {\\n    className?: string;\\n    inset?: boolean;\\n  }) {\\n  return (\\n    <ContextMenuPrimitive.Label\\n      className={cn(\\n        'text-foreground px-2 py-2 text-sm font-medium sm:py-1.5',\\n        inset && 'pl-8',\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction ContextMenuSeparator({\\n  className,\\n  ...props\\n}: ContextMenuPrimitive.SeparatorProps & React.RefAttributes<ContextMenuPrimitive.SeparatorRef>) {\\n  return (\\n    <ContextMenuPrimitive.Separator\\n      className={cn('bg-border -mx-1 my-1 h-px', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction ContextMenuShortcut({ className, ...props }: TextProps & React.RefAttributes<Text>) {\\n  return (\\n    <Text\\n      className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport {\\n  ContextMenu,\\n  ContextMenuCheckboxItem,\\n  ContextMenuContent,\\n  ContextMenuGroup,\\n  ContextMenuItem,\\n  ContextMenuLabel,\\n  ContextMenuRadioGroup,\\n  ContextMenuRadioItem,\\n  ContextMenuSeparator,\\n  ContextMenuShortcut,\\n  ContextMenuSub,\\n  ContextMenuSubContent,\\n  ContextMenuSubTrigger,\\n  ContextMenuTrigger,\\n};\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/dialog.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dialog\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Dialog\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A window overlaid on either the primary window or another dialog window, rendering the content underneath inert.\",\n  \"dependencies\": [\n    \"@rn-primitives/dialog\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\",\n    \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\",\n    \"https://reactnativereusables.com/r/uniwind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/dialog.tsx\",\n      \"content\": \"import { Icon } from '@/registry/uniwind/components/ui/icon';\\nimport { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as DialogPrimitive from '@rn-primitives/dialog';\\nimport { X } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport { Platform, Text, View, type ViewProps } from 'react-native';\\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst Dialog = DialogPrimitive.Root;\\n\\nconst DialogTrigger = DialogPrimitive.Trigger;\\n\\nconst DialogPortal = DialogPrimitive.Portal;\\n\\nconst DialogClose = DialogPrimitive.Close;\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction DialogOverlay({\\n  className,\\n  children,\\n  ...props\\n}: Omit<DialogPrimitive.OverlayProps, 'asChild'> &\\n  React.RefAttributes<DialogPrimitive.OverlayRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <FullWindowOverlay>\\n      <DialogPrimitive.Overlay\\n        className={cn(\\n          'absolute bottom-0 left-0 right-0 top-0 z-50 flex items-center justify-center bg-black/50 p-2',\\n          Platform.select({\\n            web: 'animate-in fade-in-0 fixed cursor-default [&>*]:cursor-auto',\\n          }),\\n          className\\n        )}\\n        {...props}\\n        asChild={Platform.OS !== 'web'}>\\n        <NativeOnlyAnimatedView entering={FadeIn.duration(200)} exiting={FadeOut.duration(150)}>\\n          <NativeOnlyAnimatedView entering={FadeIn.delay(50)} exiting={FadeOut.duration(150)}>\\n            <>{children}</>\\n          </NativeOnlyAnimatedView>\\n        </NativeOnlyAnimatedView>\\n      </DialogPrimitive.Overlay>\\n    </FullWindowOverlay>\\n  );\\n}\\nfunction DialogContent({\\n  className,\\n  portalHost,\\n  children,\\n  ...props\\n}: DialogPrimitive.ContentProps &\\n  React.RefAttributes<DialogPrimitive.ContentRef> & {\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <DialogPortal hostName={portalHost}>\\n      <DialogOverlay>\\n        <DialogPrimitive.Content\\n          className={cn(\\n            'bg-background border-border z-50 mx-auto flex w-full flex-col gap-4 rounded-lg border p-6 shadow-lg shadow-black/5 sm:max-w-lg',\\n            Platform.select({\\n              web: 'animate-in fade-in-0 zoom-in-95 web:max-w-[calc(100%-2rem)] duration-200',\\n            }),\\n            className\\n          )}\\n          {...props}>\\n          <>{children}</>\\n          <DialogPrimitive.Close\\n            className={cn(\\n              'absolute right-4 top-4 rounded opacity-70 active:opacity-100',\\n              Platform.select({\\n                web: 'ring-offset-background focus:ring-ring data-[state=open]:bg-accent transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-offset-2',\\n              })\\n            )}\\n            hitSlop={12}>\\n            <Icon\\n              as={X}\\n              className={cn('text-accent-foreground web:pointer-events-none size-4 shrink-0')}\\n            />\\n            <Text className=\\\"sr-only\\\">Close</Text>\\n          </DialogPrimitive.Close>\\n        </DialogPrimitive.Content>\\n      </DialogOverlay>\\n    </DialogPortal>\\n  );\\n}\\n\\nfunction DialogHeader({ className, ...props }: ViewProps) {\\n  return (\\n    <View className={cn('flex flex-col gap-2 text-center sm:text-left', className)} {...props} />\\n  );\\n}\\n\\nfunction DialogFooter({ className, ...props }: ViewProps) {\\n  return (\\n    <View\\n      className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction DialogTitle({\\n  className,\\n  ...props\\n}: DialogPrimitive.TitleProps & React.RefAttributes<DialogPrimitive.TitleRef>) {\\n  return (\\n    <DialogPrimitive.Title\\n      className={cn('text-foreground text-lg font-semibold leading-none', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction DialogDescription({\\n  className,\\n  ...props\\n}: DialogPrimitive.DescriptionProps & React.RefAttributes<DialogPrimitive.DescriptionRef>) {\\n  return (\\n    <DialogPrimitive.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\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/dropdown-menu.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"dropdown-menu\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Dropdown Menu\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a menu to the user — such as a set of actions or functions — triggered by a button.\",\n  \"dependencies\": [\n    \"@rn-primitives/dropdown-menu\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\",\n    \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\",\n    \"https://reactnativereusables.com/r/uniwind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/dropdown-menu.tsx\",\n      \"content\": \"import { Icon } from '@/registry/uniwind/components/ui/icon';\\nimport { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as DropdownMenuPrimitive from '@rn-primitives/dropdown-menu';\\nimport { Check, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport {\\n  Platform,\\n  type StyleProp,\\n  StyleSheet,\\n  Text,\\n  type TextProps,\\n  View,\\n  type ViewStyle,\\n} from 'react-native';\\nimport { FadeIn } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst DropdownMenu = DropdownMenuPrimitive.Root;\\n\\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\\n\\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\\n\\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\\n\\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\\n\\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\\n\\nfunction DropdownMenuSubTrigger({\\n  className,\\n  inset,\\n  children,\\n  iconClassName,\\n  ...props\\n}: DropdownMenuPrimitive.SubTriggerProps &\\n  React.RefAttributes<DropdownMenuPrimitive.SubTriggerRef> & {\\n    children?: React.ReactNode;\\n    iconClassName?: string;\\n    inset?: boolean;\\n  }) {\\n  const { open } = DropdownMenuPrimitive.useSubContext();\\n  const icon = Platform.OS === 'web' ? ChevronRight : open ? ChevronUp : ChevronDown;\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm select-none group-active:text-accent-foreground',\\n        open && 'text-accent-foreground'\\n      )}>\\n      <DropdownMenuPrimitive.SubTrigger\\n        className={cn(\\n          'active:bg-accent group flex flex-row items-center justify-between rounded-sm px-2 py-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none [&_svg]:pointer-events-none',\\n          }),\\n          className,\\n          open && 'bg-accent',\\n          inset && 'pl-8'\\n        )}\\n        {...props}>\\n        <>{children}</>\\n        <Icon as={icon} className={cn('text-foreground size-4 shrink-0', iconClassName)} />\\n      </DropdownMenuPrimitive.SubTrigger>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction DropdownMenuSubContent({\\n  className,\\n  ...props\\n}: DropdownMenuPrimitive.SubContentProps &\\n  React.RefAttributes<DropdownMenuPrimitive.SubContentRef>) {\\n  return (\\n    <NativeOnlyAnimatedView entering={FadeIn}>\\n      <DropdownMenuPrimitive.SubContent\\n        className={cn(\\n          'bg-popover border-border overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\\n          Platform.select({\\n            web: 'animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fade-in-0 data-[state=closed]:zoom-out-95 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 origin-(--radix-context-menu-content-transform-origin) z-50 min-w-[8rem]',\\n          }),\\n          className\\n        )}\\n        {...props}\\n      />\\n    </NativeOnlyAnimatedView>\\n  );\\n}\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction DropdownMenuContent({\\n  className,\\n  overlayClassName,\\n  overlayStyle,\\n  portalHost,\\n  ...props\\n}: DropdownMenuPrimitive.ContentProps &\\n  React.RefAttributes<DropdownMenuPrimitive.ContentRef> & {\\n    overlayStyle?: StyleProp<ViewStyle>;\\n    overlayClassName?: string;\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <DropdownMenuPrimitive.Portal hostName={portalHost}>\\n      <FullWindowOverlay>\\n        <DropdownMenuPrimitive.Overlay\\n          style={Platform.select({\\n            web: overlayStyle ?? undefined,\\n            native: overlayStyle\\n              ? StyleSheet.flatten([\\n                StyleSheet.absoluteFill,\\n                overlayStyle as typeof StyleSheet.absoluteFill,\\n              ])\\n              : StyleSheet.absoluteFill,\\n          })}\\n          className={overlayClassName}>\\n          <NativeOnlyAnimatedView entering={FadeIn}>\\n            <TextClassContext.Provider value=\\\"text-popover-foreground\\\">\\n              <DropdownMenuPrimitive.Content\\n                className={cn(\\n                  'bg-popover border-border min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\\n                  Platform.select({\\n                    web: cn(\\n                      'animate-in fade-in-0 zoom-in-95 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) z-50 cursor-default',\\n                      props.side === 'bottom' && 'slide-in-from-top-2',\\n                      props.side === 'top' && 'slide-in-from-bottom-2'\\n                    ),\\n                  }),\\n                  className\\n                )}\\n                {...props}\\n              />\\n            </TextClassContext.Provider>\\n          </NativeOnlyAnimatedView>\\n        </DropdownMenuPrimitive.Overlay>\\n      </FullWindowOverlay>\\n    </DropdownMenuPrimitive.Portal>\\n  );\\n}\\n\\nfunction DropdownMenuItem({\\n  className,\\n  inset,\\n  variant,\\n  ...props\\n}: DropdownMenuPrimitive.ItemProps &\\n  React.RefAttributes<DropdownMenuPrimitive.ItemRef> & {\\n    className?: string;\\n    inset?: boolean;\\n    variant?: 'default' | 'destructive';\\n  }) {\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'select-none text-sm text-popover-foreground group-active:text-popover-foreground',\\n        variant === 'destructive' && 'text-destructive group-active:text-destructive'\\n      )}>\\n      <DropdownMenuPrimitive.Item\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm px-2 py-2 sm:py-1.5',\\n          Platform.select({\\n            web: cn(\\n              'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n              variant === 'destructive' && 'focus:bg-destructive/10 dark:focus:bg-destructive/20'\\n            ),\\n          }),\\n          variant === 'destructive' && 'active:bg-destructive/10 dark:active:bg-destructive/20',\\n          props.disabled && 'opacity-50',\\n          inset && 'pl-8',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction DropdownMenuCheckboxItem({\\n  className,\\n  children,\\n  ...props\\n}: DropdownMenuPrimitive.CheckboxItemProps &\\n  React.RefAttributes<DropdownMenuPrimitive.CheckboxItemRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\\\">\\n      <DropdownMenuPrimitive.CheckboxItem\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n          }),\\n          props.disabled && 'opacity-50',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\\\">\\n          <DropdownMenuPrimitive.ItemIndicator>\\n            <Icon\\n              as={Check}\\n              className={cn(\\n                'text-foreground size-4',\\n                Platform.select({ web: 'pointer-events-none' })\\n              )}\\n            />\\n          </DropdownMenuPrimitive.ItemIndicator>\\n        </View>\\n        <>{children}</>\\n      </DropdownMenuPrimitive.CheckboxItem>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction DropdownMenuRadioItem({\\n  className,\\n  children,\\n  ...props\\n}: DropdownMenuPrimitive.RadioItemProps &\\n  React.RefAttributes<DropdownMenuPrimitive.RadioItemRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\\\">\\n      <DropdownMenuPrimitive.RadioItem\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n          }),\\n          props.disabled && 'opacity-50',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\\\">\\n          <DropdownMenuPrimitive.ItemIndicator>\\n            <View className=\\\"bg-foreground h-2 w-2 rounded-full\\\" />\\n          </DropdownMenuPrimitive.ItemIndicator>\\n        </View>\\n        <>{children}</>\\n      </DropdownMenuPrimitive.RadioItem>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction DropdownMenuLabel({\\n  className,\\n  inset,\\n  ...props\\n}: DropdownMenuPrimitive.LabelProps &\\n  React.RefAttributes<DropdownMenuPrimitive.LabelRef> & {\\n    className?: string;\\n    inset?: boolean;\\n  }) {\\n  return (\\n    <DropdownMenuPrimitive.Label\\n      className={cn(\\n        'text-foreground px-2 py-2 text-sm font-medium sm:py-1.5',\\n        inset && 'pl-8',\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction DropdownMenuSeparator({\\n  className,\\n  ...props\\n}: DropdownMenuPrimitive.SeparatorProps & React.RefAttributes<DropdownMenuPrimitive.SeparatorRef>) {\\n  return (\\n    <DropdownMenuPrimitive.Separator\\n      className={cn('bg-border -mx-1 my-1 h-px', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction DropdownMenuShortcut({ className, ...props }: TextProps & React.RefAttributes<Text>) {\\n  return (\\n    <Text\\n      className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\\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\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/forgot-password-form-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"forgot-password-form-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"Forgot Password Form (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form that sends a password reset OTP to the user's email address with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/card.json\",\n    \"https://reactnativereusables.com/r/uniwind/input.json\",\n    \"https://reactnativereusables.com/r/uniwind/label.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/forgot-password-form.tsx\",\n      \"content\": \"import { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { useSignIn } from '@clerk/clerk-expo';\\nimport * as React from 'react';\\nimport { View } from 'react-native';\\n\\nexport function ForgotPasswordForm() {\\n  const [email, setEmail] = React.useState('');\\n  const { signIn, isLoaded } = useSignIn();\\n  const [error, setError] = React.useState<{ email?: string; password?: string }>({});\\n\\n  const onSubmit = async () => {\\n    if (!email) {\\n      setError({ email: 'Email is required' });\\n      return;\\n    }\\n    if (!isLoaded) {\\n      return;\\n    }\\n\\n    try {\\n      await signIn.create({\\n        strategy: 'reset_password_email_code',\\n        identifier: email,\\n      });\\n\\n      // TODO: Navigate to reset password screen\\n    } catch (err) {\\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\\n      if (err instanceof Error) {\\n        setError({ email: err.message });\\n        return;\\n      }\\n      console.error(JSON.stringify(err, null, 2));\\n    }\\n  };\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Forgot password?</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Enter your email to reset your password\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input\\n                id=\\\"email\\\"\\n                defaultValue={email}\\n                placeholder=\\\"m@example.com\\\"\\n                keyboardType=\\\"email-address\\\"\\n                autoComplete=\\\"email\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onChangeText={setEmail}\\n                onSubmitEditing={onSubmit}\\n                returnKeyType=\\\"send\\\"\\n              />\\n              {error.email ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.email}</Text>\\n              ) : null}\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Reset your password</Text>\\n            </Button>\\n          </View>\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/forgot-password-form.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"forgot-password-form\",\n  \"type\": \"registry:component\",\n  \"title\": \"Forgot Password Form\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form that sends a password reset OTP to the user's email address.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/card.json\",\n    \"https://reactnativereusables.com/r/uniwind/input.json\",\n    \"https://reactnativereusables.com/r/uniwind/label.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/forgot-password-form.tsx\",\n      \"content\": \"import { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { View } from 'react-native';\\n\\nexport function ForgotPasswordForm() {\\n  function onSubmit() {\\n    // TODO: Submit form and navigate to reset password screen if successful\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Forgot password?</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Enter your email to reset your password\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input\\n                id=\\\"email\\\"\\n                placeholder=\\\"m@example.com\\\"\\n                keyboardType=\\\"email-address\\\"\\n                autoComplete=\\\"email\\\"\\n                autoCapitalize=\\\"none\\\"\\n                returnKeyType=\\\"send\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Reset your password</Text>\\n            </Button>\\n          </View>\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/hover-card.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"hover-card\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Hover Card\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"For sighted users to preview content available behind a link.\",\n  \"dependencies\": [\n    \"@rn-primitives/hover-card\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\",\n    \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/hover-card.tsx\",\n      \"content\": \"import { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as HoverCardPrimitive from '@rn-primitives/hover-card';\\nimport * as React from 'react';\\nimport { Platform, StyleSheet } from 'react-native';\\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst HoverCard = HoverCardPrimitive.Root;\\n\\nconst HoverCardTrigger = HoverCardPrimitive.Trigger;\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction HoverCardContent({\\n  className,\\n  align = 'center',\\n  sideOffset = 4,\\n  ...props\\n}: HoverCardPrimitive.ContentProps & React.RefAttributes<HoverCardPrimitive.ContentRef>) {\\n  return (\\n    <HoverCardPrimitive.Portal>\\n      <FullWindowOverlay>\\n        <HoverCardPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\\n          <NativeOnlyAnimatedView entering={FadeIn} exiting={FadeOut}>\\n            <TextClassContext.Provider value=\\\"text-popover-foreground\\\">\\n              <HoverCardPrimitive.Content\\n                align={align}\\n                sideOffset={sideOffset}\\n                className={cn(\\n                  'bg-popover border-border outline-hidden z-50 w-64 rounded-md border p-4 shadow-md shadow-black/5',\\n                  Platform.select({\\n                    web: cn(\\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-hover-card-content-transform-origin) cursor-default [&>*]:cursor-auto',\\n                      props.side === 'bottom' && 'slide-in-from-top-2',\\n                      props.side === 'top' && 'slide-in-from-bottom-2'\\n                    ),\\n                  }),\\n                  className\\n                )}\\n                {...props}\\n              />\\n            </TextClassContext.Provider>\\n          </NativeOnlyAnimatedView>\\n        </HoverCardPrimitive.Overlay>\\n      </FullWindowOverlay>\\n    </HoverCardPrimitive.Portal>\\n  );\\n}\\n\\nexport { HoverCard, HoverCardContent, HoverCardTrigger };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/icon.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"icon\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Icon\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A component for displaying icons with consistent styling.\",\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/icon.tsx\",\n      \"content\": \"import { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport type { LucideIcon, LucideProps } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport { withUniwind } from 'uniwind';\\n\\ntype IconProps = LucideProps & {\\n  as: LucideIcon;\\n};\\n\\nfunction IconImpl({ as: IconComponent, ...props }: IconProps) {\\n  return <IconComponent {...props} />;\\n}\\n\\nconst StyledIcon = withUniwind(IconImpl, {\\n  size: {\\n    fromClassName: 'className',\\n    styleProperty: 'width',\\n  },\\n  color: {\\n    fromClassName: 'className',\\n    styleProperty: 'color',\\n  },\\n});\\n\\n/**\\n * A wrapper component for Lucide icons with Uniwind `className` support via `withUniwind`.\\n *\\n * This component allows you to render any Lucide icon while applying utility classes\\n * using `uniwind`. It avoids the need to wrap or configure each icon individually.\\n *\\n * @component\\n * @example\\n * ```tsx\\n * import { ArrowRight } from 'lucide-react-native';\\n * import { Icon } from '@/registry/uniwind/registry/components/ui/icon';\\n *\\n * <Icon as={ArrowRight} className=\\\"text-red-500 size-4\\\" />\\n * ```\\n *\\n * @param {LucideIcon} as - The Lucide icon component to render.\\n * @param {string} className - Utility classes to style the icon using Uniwind.\\n * @param {number} size - Icon size (overrides the size class).\\n * @param {...LucideProps} ...props - Additional Lucide icon props passed to the \\\"as\\\" icon.\\n */\\nfunction Icon({ as: IconComponent, className, ...props }: IconProps) {\\n  const textClass = React.useContext(TextClassContext);\\n  return (\\n    <StyledIcon as={IconComponent} className={cn('text-foreground size-5', textClass, className)} {...props} />\\n  );\\n}\\n\\nexport { Icon };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/input.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"input\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Input\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a form input field or a component that looks like an input field.\",\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/input.tsx\",\n      \"content\": \"import { cn } from '@/registry/uniwind/lib/utils';\\nimport { Platform, TextInput, type TextInputProps } from 'react-native';\\n\\nfunction Input({\\n  className,\\n  placeholderClassName,\\n  ...props\\n}: TextInputProps & React.RefAttributes<TextInput>) {\\n  return (\\n    <TextInput\\n      className={cn(\\n        'dark:bg-input/30 border-input bg-background text-foreground flex h-10 w-full min-w-0 flex-row items-center rounded-md border px-3 py-1 text-base leading-5 shadow-sm shadow-black/5 sm:h-9',\\n        props.editable === false &&\\n          cn(\\n            'opacity-50',\\n            Platform.select({ web: 'disabled:pointer-events-none disabled:cursor-not-allowed' })\\n          ),\\n        Platform.select({\\n          web: cn(\\n            'placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground outline-none transition-[color,box-shadow] md:text-sm',\\n            'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\\n            'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive'\\n          ),\\n          native: 'placeholder:text-muted-foreground/50',\\n        }),\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Input };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/label.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"label\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Label\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Renders an accessible label associated with controls.\",\n  \"dependencies\": [\n    \"@rn-primitives/label\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/label.tsx\",\n      \"content\": \"import { cn } from '@/registry/uniwind/lib/utils';\\nimport * as LabelPrimitive from '@rn-primitives/label';\\nimport { Platform } from 'react-native';\\n\\nfunction Label({\\n  className,\\n  onPress,\\n  onLongPress,\\n  onPressIn,\\n  onPressOut,\\n  disabled,\\n  ...props\\n}: LabelPrimitive.TextProps & React.RefAttributes<LabelPrimitive.TextRef>) {\\n  return (\\n    <LabelPrimitive.Root\\n      className={cn(\\n        'flex select-none flex-row items-center gap-2',\\n        Platform.select({\\n          web: 'cursor-default leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-50 group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50',\\n        }),\\n        disabled && 'opacity-50'\\n      )}\\n      onPress={onPress}\\n      onLongPress={onLongPress}\\n      onPressIn={onPressIn}\\n      onPressOut={onPressOut}\\n      disabled={disabled}>\\n      <LabelPrimitive.Text\\n        className={cn(\\n          'text-foreground text-sm font-medium',\\n          Platform.select({ web: 'leading-none' }),\\n          className\\n        )}\\n        {...props}\\n      />\\n    </LabelPrimitive.Root>\\n  );\\n}\\n\\nexport { Label };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/menubar.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"menubar\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Menubar\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A visually persistent menu common in desktop applications that provides quick access to a consistent set of commands.\",\n  \"dependencies\": [\n    \"@rn-primitives/menubar\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\",\n    \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\",\n    \"https://reactnativereusables.com/r/uniwind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/menubar.tsx\",\n      \"content\": \"import { Icon } from '@/registry/uniwind/components/ui/icon';\\nimport { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as MenubarPrimitive from '@rn-primitives/menubar';\\nimport { Portal } from '@rn-primitives/portal';\\nimport { Check, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport {\\n  Platform,\\n  Pressable,\\n  type StyleProp,\\n  StyleSheet,\\n  Text,\\n  type TextProps,\\n  View,\\n  type ViewStyle,\\n} from 'react-native';\\nimport { FadeIn } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst MenubarMenu = MenubarPrimitive.Menu;\\n\\nconst MenubarGroup = MenubarPrimitive.Group;\\n\\nconst MenubarPortal = MenubarPrimitive.Portal;\\n\\nconst MenubarSub = MenubarPrimitive.Sub;\\n\\nconst MenubarRadioGroup = MenubarPrimitive.RadioGroup;\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction Menubar({\\n  className,\\n  value: valueProp,\\n  onValueChange: onValueChangeProp,\\n  ...props\\n}: MenubarPrimitive.RootProps & React.RefAttributes<MenubarPrimitive.RootRef>) {\\n  const id = React.useId();\\n  const [value, setValue] = React.useState<string | undefined>(undefined);\\n\\n  function closeMenu() {\\n    if (onValueChangeProp) {\\n      onValueChangeProp(undefined);\\n      return;\\n    }\\n    setValue(undefined);\\n  }\\n\\n  return (\\n    <>\\n      {Platform.OS !== 'web' && (value || valueProp) ? (\\n        <Portal name={`menubar-overlay-${id}`}>\\n          <Pressable onPress={closeMenu} style={StyleSheet.absoluteFill} />\\n        </Portal>\\n      ) : null}\\n      <MenubarPrimitive.Root\\n        className={cn(\\n          'bg-background border-border flex h-10 flex-row items-center gap-1 rounded-md border p-1 shadow-sm shadow-black/5 sm:h-9',\\n          className\\n        )}\\n        value={value ?? valueProp}\\n        onValueChange={onValueChangeProp ?? setValue}\\n        {...props}\\n      />\\n    </>\\n  );\\n}\\n\\nfunction MenubarTrigger({\\n  className,\\n  ...props\\n}: MenubarPrimitive.TriggerProps & React.RefAttributes<MenubarPrimitive.TriggerRef>) {\\n  const { value } = MenubarPrimitive.useRootContext();\\n  const { value: itemValue } = MenubarPrimitive.useMenuContext();\\n\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm font-medium select-none group-active:text-accent-foreground',\\n        value === itemValue && 'text-accent-foreground'\\n      )}>\\n      <MenubarPrimitive.Trigger\\n        className={cn(\\n          'group flex items-center rounded-md px-2 py-1.5 sm:py-1',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none',\\n          }),\\n          value === itemValue && 'bg-accent',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction MenubarSubTrigger({\\n  className,\\n  inset,\\n  children,\\n  iconClassName,\\n  ...props\\n}: MenubarPrimitive.SubTriggerProps &\\n  React.RefAttributes<MenubarPrimitive.SubTriggerRef> & {\\n    children?: React.ReactNode;\\n    iconClassName?: string;\\n    inset?: boolean;\\n  }) {\\n  const { open } = MenubarPrimitive.useSubContext();\\n  const icon = Platform.OS === 'web' ? ChevronRight : open ? ChevronUp : ChevronDown;\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm select-none group-active:text-accent-foreground',\\n        open && 'text-accent-foreground'\\n      )}>\\n      <MenubarPrimitive.SubTrigger\\n        className={cn(\\n          'active:bg-accent group flex flex-row items-center justify-between rounded-sm px-2 py-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none [&_svg]:pointer-events-none',\\n          }),\\n          className,\\n          open && 'bg-accent',\\n          inset && 'pl-8'\\n        )}\\n        {...props}>\\n        <>{children}</>\\n        <Icon as={icon} className={cn('text-foreground size-4 shrink-0', iconClassName)} />\\n      </MenubarPrimitive.SubTrigger>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction MenubarSubContent({\\n  className,\\n  ...props\\n}: MenubarPrimitive.SubContentProps & React.RefAttributes<MenubarPrimitive.SubContentRef>) {\\n  return (\\n    <NativeOnlyAnimatedView entering={FadeIn}>\\n      <MenubarPrimitive.SubContent\\n        className={cn(\\n          'bg-popover border-border overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\\n          Platform.select({\\n            web: 'animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fade-in-0 data-[state=closed]:zoom-out-95 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 origin-(--radix-context-menu-content-transform-origin) z-50 min-w-[8rem]',\\n          }),\\n          className\\n        )}\\n        {...props}\\n      />\\n    </NativeOnlyAnimatedView>\\n  );\\n}\\n\\nfunction MenubarContent({\\n  className,\\n  overlayClassName,\\n  overlayStyle,\\n  portalHost,\\n  align = 'start',\\n  alignOffset = -4,\\n  sideOffset = 8,\\n  ...props\\n}: MenubarPrimitive.ContentProps &\\n  React.RefAttributes<MenubarPrimitive.ContentRef> & {\\n    overlayStyle?: StyleProp<ViewStyle>;\\n    overlayClassName?: string;\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <MenubarPrimitive.Portal hostName={portalHost}>\\n      <FullWindowOverlay>\\n        <NativeOnlyAnimatedView\\n          entering={FadeIn}\\n          style={StyleSheet.absoluteFill}\\n          pointerEvents=\\\"box-none\\\">\\n          <TextClassContext.Provider value=\\\"text-popover-foreground\\\">\\n            <MenubarPrimitive.Content\\n              className={cn(\\n                'bg-popover border-border min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\\n                Platform.select({\\n                  web: cn(\\n                    'animate-in fade-in-0 zoom-in-95 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) z-50 cursor-default',\\n                    props.side === 'bottom' && 'slide-in-from-top-2',\\n                    props.side === 'top' && 'slide-in-from-bottom-2'\\n                  ),\\n                }),\\n                className\\n              )}\\n              align={align}\\n              alignOffset={alignOffset}\\n              sideOffset={sideOffset}\\n              {...props}\\n            />\\n          </TextClassContext.Provider>\\n        </NativeOnlyAnimatedView>\\n      </FullWindowOverlay>\\n    </MenubarPrimitive.Portal>\\n  );\\n}\\n\\nfunction MenubarItem({\\n  className,\\n  inset,\\n  variant,\\n  ...props\\n}: MenubarPrimitive.ItemProps &\\n  React.RefAttributes<MenubarPrimitive.ItemRef> & {\\n    className?: string;\\n    inset?: boolean;\\n    variant?: 'default' | 'destructive';\\n  }) {\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'select-none text-sm text-popover-foreground group-active:text-popover-foreground',\\n        variant === 'destructive' && 'text-destructive group-active:text-destructive'\\n      )}>\\n      <MenubarPrimitive.Item\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm px-2 py-2 sm:py-1.5',\\n          Platform.select({\\n            web: cn(\\n              'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n              variant === 'destructive' && 'focus:bg-destructive/10 dark:focus:bg-destructive/20'\\n            ),\\n          }),\\n          variant === 'destructive' && 'active:bg-destructive/10 dark:active:bg-destructive/20',\\n          props.disabled && 'opacity-50',\\n          inset && 'pl-8',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction MenubarCheckboxItem({\\n  className,\\n  children,\\n  ...props\\n}: MenubarPrimitive.CheckboxItemProps &\\n  React.RefAttributes<MenubarPrimitive.CheckboxItemRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\\\">\\n      <MenubarPrimitive.CheckboxItem\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n          }),\\n          props.disabled && 'opacity-50',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\\\">\\n          <MenubarPrimitive.ItemIndicator>\\n            <Icon\\n              as={Check}\\n              className={cn(\\n                'text-foreground size-4',\\n                Platform.select({ web: 'pointer-events-none' })\\n              )}\\n            />\\n          </MenubarPrimitive.ItemIndicator>\\n        </View>\\n        <>{children}</>\\n      </MenubarPrimitive.CheckboxItem>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction MenubarRadioItem({\\n  className,\\n  children,\\n  ...props\\n}: MenubarPrimitive.RadioItemProps &\\n  React.RefAttributes<MenubarPrimitive.RadioItemRef> & {\\n    children?: React.ReactNode;\\n  }) {\\n  return (\\n    <TextClassContext.Provider value=\\\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\\\">\\n      <MenubarPrimitive.RadioItem\\n        className={cn(\\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\\n          Platform.select({\\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\\n          }),\\n          props.disabled && 'opacity-50',\\n          className\\n        )}\\n        {...props}>\\n        <View className=\\\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\\\">\\n          <MenubarPrimitive.ItemIndicator>\\n            <View className=\\\"bg-foreground h-2 w-2 rounded-full\\\" />\\n          </MenubarPrimitive.ItemIndicator>\\n        </View>\\n        <>{children}</>\\n      </MenubarPrimitive.RadioItem>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction MenubarLabel({\\n  className,\\n  inset,\\n  ...props\\n}: MenubarPrimitive.LabelProps &\\n  React.RefAttributes<MenubarPrimitive.LabelRef> & {\\n    className?: string;\\n    inset?: boolean;\\n  }) {\\n  return (\\n    <MenubarPrimitive.Label\\n      className={cn(\\n        'text-foreground px-2 py-2 text-sm font-medium sm:py-1.5',\\n        inset && 'pl-8',\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction MenubarSeparator({\\n  className,\\n  ...props\\n}: MenubarPrimitive.SeparatorProps & React.RefAttributes<MenubarPrimitive.SeparatorRef>) {\\n  return (\\n    <MenubarPrimitive.Separator className={cn('bg-border -mx-1 my-1 h-px', className)} {...props} />\\n  );\\n}\\n\\nfunction MenubarShortcut({ className, ...props }: TextProps & React.RefAttributes<Text>) {\\n  return (\\n    <Text\\n      className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport {\\n  Menubar,\\n  MenubarCheckboxItem,\\n  MenubarContent,\\n  MenubarGroup,\\n  MenubarItem,\\n  MenubarLabel,\\n  MenubarMenu,\\n  MenubarPortal,\\n  MenubarRadioGroup,\\n  MenubarRadioItem,\\n  MenubarSeparator,\\n  MenubarShortcut,\\n  MenubarSub,\\n  MenubarSubContent,\\n  MenubarSubTrigger,\\n  MenubarTrigger,\\n};\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/native-only-animated-view.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"native-only-animated-view\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Native Only Animated View\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A component that is only rendered and animated on native platforms.\",\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/native-only-animated-view.tsx\",\n      \"content\": \"import { Platform } from 'react-native';\\nimport Animated from 'react-native-reanimated';\\n\\n/**\\n * This component is used to wrap animated views that should only be animated on native.\\n * @param props - The props for the animated view.\\n * @returns The animated view if the platform is native, otherwise the children.\\n * @example\\n * <NativeOnlyAnimatedView entering={FadeIn} exiting={FadeOut}>\\n *   <Text>I am only animated on native</Text>\\n * </NativeOnlyAnimatedView>\\n */\\nfunction NativeOnlyAnimatedView(\\n  props: React.ComponentProps<typeof Animated.View> & React.RefAttributes<Animated.View>\\n) {\\n  if (Platform.OS === 'web') {\\n    return <>{props.children as React.ReactNode}</>;\\n  } else {\\n    return <Animated.View {...props} />;\\n  }\\n}\\n\\nexport { NativeOnlyAnimatedView };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/popover.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"popover\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Popover\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays rich content in a portal, triggered by a button.\",\n  \"dependencies\": [\n    \"@rn-primitives/popover\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\",\n    \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/popover.tsx\",\n      \"content\": \"import { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as PopoverPrimitive from '@rn-primitives/popover';\\nimport * as React from 'react';\\nimport { Platform, StyleSheet } from 'react-native';\\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst Popover = PopoverPrimitive.Root;\\n\\nconst PopoverTrigger = PopoverPrimitive.Trigger;\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction PopoverContent({\\n  className,\\n  align = 'center',\\n  sideOffset = 4,\\n  portalHost,\\n  ...props\\n}: PopoverPrimitive.ContentProps &\\n  React.RefAttributes<PopoverPrimitive.ContentRef> & {\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <PopoverPrimitive.Portal hostName={portalHost}>\\n      <FullWindowOverlay>\\n        <PopoverPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\\n          <NativeOnlyAnimatedView entering={FadeIn.duration(200)} exiting={FadeOut}>\\n            <TextClassContext.Provider value=\\\"text-popover-foreground\\\">\\n              <PopoverPrimitive.Content\\n                align={align}\\n                sideOffset={sideOffset}\\n                className={cn(\\n                  'bg-popover border-border outline-hidden z-50 w-72 rounded-md border p-4 shadow-md shadow-black/5',\\n                  Platform.select({\\n                    web: cn(\\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-popover-content-transform-origin) cursor-auto',\\n                      props.side === 'bottom' && 'slide-in-from-top-2',\\n                      props.side === 'top' && 'slide-in-from-bottom-2'\\n                    ),\\n                  }),\\n                  className\\n                )}\\n                {...props}\\n              />\\n            </TextClassContext.Provider>\\n          </NativeOnlyAnimatedView>\\n        </PopoverPrimitive.Overlay>\\n      </FullWindowOverlay>\\n    </PopoverPrimitive.Portal>\\n  );\\n}\\n\\nexport { Popover, PopoverContent, PopoverTrigger };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/progress.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"progress\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Progress\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.\",\n  \"dependencies\": [\n    \"@rn-primitives/progress\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/progress.tsx\",\n      \"content\": \"import { cn } from '@/registry/uniwind/lib/utils';\\nimport * as ProgressPrimitive from '@rn-primitives/progress';\\nimport { Platform, View } from 'react-native';\\nimport Animated, {\\n  Extrapolation,\\n  interpolate,\\n  useAnimatedStyle,\\n  useDerivedValue,\\n  withSpring,\\n} from 'react-native-reanimated';\\n\\nfunction Progress({\\n  className,\\n  value,\\n  indicatorClassName,\\n  ...props\\n}: ProgressPrimitive.RootProps &\\n  React.RefAttributes<ProgressPrimitive.RootRef> & {\\n    indicatorClassName?: string;\\n  }) {\\n  return (\\n    <ProgressPrimitive.Root\\n      className={cn('bg-primary/20 relative h-2 w-full overflow-hidden rounded-full', className)}\\n      {...props}>\\n      <Indicator value={value} className={indicatorClassName} />\\n    </ProgressPrimitive.Root>\\n  );\\n}\\n\\nexport { Progress };\\n\\nconst Indicator = Platform.select({\\n  web: WebIndicator,\\n  native: NativeIndicator,\\n  default: NullIndicator,\\n});\\n\\ntype IndicatorProps = {\\n  value: number | undefined | null;\\n  className?: string;\\n};\\n\\nfunction WebIndicator({ value, className }: IndicatorProps) {\\n  if (Platform.OS !== 'web') {\\n    return null;\\n  }\\n\\n  return (\\n    <View\\n      className={cn('bg-primary h-full w-full flex-1 transition-all', className)}\\n      style={{ transform: `translateX(-${100 - (value ?? 0)}%)` }}>\\n      <ProgressPrimitive.Indicator className={cn('h-full w-full', className)} />\\n    </View>\\n  );\\n}\\n\\nfunction NativeIndicator({ value, className }: IndicatorProps) {\\n  const progress = useDerivedValue(() => value ?? 0);\\n\\n  const indicator = useAnimatedStyle(() => {\\n    return {\\n      width: withSpring(\\n        `${interpolate(progress.value, [0, 100], [1, 100], Extrapolation.CLAMP)}%`,\\n        { overshootClamping: true }\\n      ),\\n    };\\n  }, [value]);\\n\\n  if (Platform.OS === 'web') {\\n    return null;\\n  }\\n\\n  return (\\n    <ProgressPrimitive.Indicator asChild>\\n      <Animated.View style={indicator} className={cn('bg-foreground h-full', className)} />\\n    </ProgressPrimitive.Indicator>\\n  );\\n}\\n\\nfunction NullIndicator(_props: IndicatorProps) {\\n  return null;\\n}\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/radio-group.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"radio-group\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Radio Group\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A set of checkable buttons—known as radio buttons—where no more than one of the buttons can be checked at a time.\",\n  \"dependencies\": [\n    \"@rn-primitives/radio-group\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/radio-group.tsx\",\n      \"content\": \"import { cn } from '@/registry/uniwind/lib/utils';\\nimport * as RadioGroupPrimitive from '@rn-primitives/radio-group';\\nimport { Platform } from 'react-native';\\n\\nfunction RadioGroup({\\n  className,\\n  ...props\\n}: RadioGroupPrimitive.RootProps & React.RefAttributes<RadioGroupPrimitive.RootRef>) {\\n  return <RadioGroupPrimitive.Root className={cn('gap-3', className)} {...props} />;\\n}\\n\\nfunction RadioGroupItem({\\n  className,\\n  ...props\\n}: RadioGroupPrimitive.ItemProps & React.RefAttributes<RadioGroupPrimitive.ItemRef>) {\\n  return (\\n    <RadioGroupPrimitive.Item\\n      className={cn(\\n        'border-input dark:bg-input/30 aspect-square size-4 shrink-0 items-center justify-center rounded-full border shadow-sm shadow-black/5',\\n        Platform.select({\\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive outline-none transition-all focus-visible:ring-[3px] disabled:cursor-not-allowed',\\n        }),\\n        props.disabled && 'opacity-50',\\n        className\\n      )}\\n      {...props}>\\n      <RadioGroupPrimitive.Indicator className=\\\"bg-primary size-2 rounded-full\\\" />\\n    </RadioGroupPrimitive.Item>\\n  );\\n}\\n\\nexport { RadioGroup, RadioGroupItem };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/reset-password-form-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"reset-password-form-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"Reset Password Form (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for resetting a password with an OTP sent via email with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/card.json\",\n    \"https://reactnativereusables.com/r/uniwind/input.json\",\n    \"https://reactnativereusables.com/r/uniwind/label.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/reset-password-form.tsx\",\n      \"content\": \"import { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { useSignIn } from '@clerk/clerk-expo';\\nimport * as React from 'react';\\nimport { TextInput, View } from 'react-native';\\n\\nexport function ResetPasswordForm() {\\n  const { signIn, setActive, isLoaded } = useSignIn();\\n  const [password, setPassword] = React.useState('');\\n  const [code, setCode] = React.useState('');\\n  const codeInputRef = React.useRef<TextInput>(null);\\n  const [error, setError] = React.useState({ code: '', password: '' });\\n\\n  async function onSubmit() {\\n    if (!isLoaded) {\\n      return;\\n    }\\n    try {\\n      const result = await signIn?.attemptFirstFactor({\\n        strategy: 'reset_password_email_code',\\n        code,\\n        password,\\n      });\\n\\n      if (result.status === 'complete') {\\n        // Set the active session to\\n        // the newly created session (user is now signed in)\\n        setActive({ session: result.createdSessionId });\\n        // TODO: If your app does not use `Stack.Protected`, navigate to your protected screen\\n        return;\\n      }\\n      // TODO: Handle other statuses\\n    } catch (err) {\\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\\n      if (err instanceof Error) {\\n        const isPasswordMessage = err.message.toLowerCase().includes('password');\\n        setError({ code: '', password: isPasswordMessage ? err.message : '' });\\n        return;\\n      }\\n      console.error(JSON.stringify(err, null, 2));\\n    }\\n  }\\n\\n  function onPasswordSubmitEditing() {\\n    codeInputRef.current?.focus();\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Reset password</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Enter the code sent to your email and set a new password\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <View className=\\\"flex-row items-center\\\">\\n                <Label htmlFor=\\\"password\\\">New password</Label>\\n              </View>\\n              <Input\\n                id=\\\"password\\\"\\n                secureTextEntry\\n                onChangeText={setPassword}\\n                returnKeyType=\\\"next\\\"\\n                submitBehavior=\\\"submit\\\"\\n                onSubmitEditing={onPasswordSubmitEditing}\\n              />\\n              {error.password ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.password}</Text>\\n              ) : null}\\n            </View>\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"code\\\">Verification code</Label>\\n              <Input\\n                id=\\\"code\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onChangeText={setCode}\\n                returnKeyType=\\\"send\\\"\\n                keyboardType=\\\"numeric\\\"\\n                autoComplete=\\\"sms-otp\\\"\\n                textContentType=\\\"oneTimeCode\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n              {error.code ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.code}</Text>\\n              ) : null}\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Reset Password</Text>\\n            </Button>\\n          </View>\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/reset-password-form.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"reset-password-form\",\n  \"type\": \"registry:component\",\n  \"title\": \"Reset Password Form\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for resetting a password with an OTP sent via email.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/card.json\",\n    \"https://reactnativereusables.com/r/uniwind/input.json\",\n    \"https://reactnativereusables.com/r/uniwind/label.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/reset-password-form.tsx\",\n      \"content\": \"import { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport * as React from 'react';\\nimport { TextInput, View } from 'react-native';\\n\\nexport function ResetPasswordForm() {\\n  const codeInputRef = React.useRef<TextInput>(null);\\n\\n  function onPasswordSubmitEditing() {\\n    codeInputRef.current?.focus();\\n  }\\n\\n  function onSubmit() {\\n    // TODO: Submit form and navigate to protected screen if successful\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Reset password</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Enter the code sent to your email and set a new password\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <View className=\\\"flex-row items-center\\\">\\n                <Label htmlFor=\\\"password\\\">New password</Label>\\n              </View>\\n              <Input\\n                id=\\\"password\\\"\\n                secureTextEntry\\n                returnKeyType=\\\"next\\\"\\n                submitBehavior=\\\"submit\\\"\\n                onSubmitEditing={onPasswordSubmitEditing}\\n              />\\n            </View>\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"code\\\">Verification code</Label>\\n              <Input\\n                id=\\\"code\\\"\\n                autoCapitalize=\\\"none\\\"\\n                returnKeyType=\\\"send\\\"\\n                keyboardType=\\\"numeric\\\"\\n                autoComplete=\\\"sms-otp\\\"\\n                textContentType=\\\"oneTimeCode\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Reset Password</Text>\\n            </Button>\\n          </View>\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/select.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"select\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Select\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a list of options for the user to pick from—triggered by a button.\",\n  \"dependencies\": [\n    \"@rn-primitives/select\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\",\n    \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\",\n    \"https://reactnativereusables.com/r/uniwind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/select.tsx\",\n      \"content\": \"import { Icon } from '@/registry/uniwind/components/ui/icon';\\nimport { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as SelectPrimitive from '@rn-primitives/select';\\nimport { Check, ChevronDown, ChevronDownIcon, ChevronUpIcon } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport { Platform, ScrollView, StyleSheet, View } from 'react-native';\\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\ntype Option = SelectPrimitive.Option;\\n\\nconst Select = SelectPrimitive.Root;\\n\\nconst SelectGroup = SelectPrimitive.Group;\\n\\nfunction SelectValue({\\n  ref,\\n  className,\\n  ...props\\n}: SelectPrimitive.ValueProps &\\n  React.RefAttributes<SelectPrimitive.ValueRef> & {\\n    className?: string;\\n  }) {\\n  const { value } = SelectPrimitive.useRootContext();\\n  return (\\n    <SelectPrimitive.Value\\n      ref={ref}\\n      className={cn(\\n        'text-foreground line-clamp-1 flex flex-row items-center gap-2 text-sm',\\n        !value && 'text-muted-foreground',\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction SelectTrigger({\\n  ref,\\n  className,\\n  children,\\n  size = 'default',\\n  ...props\\n}: SelectPrimitive.TriggerProps &\\n  React.RefAttributes<SelectPrimitive.TriggerRef> & {\\n    children?: React.ReactNode;\\n    size?: 'default' | 'sm';\\n  }) {\\n  return (\\n    <SelectPrimitive.Trigger\\n      ref={ref}\\n      className={cn(\\n        'border-input dark:bg-input/30 dark:active:bg-input/50 bg-background flex h-10 flex-row items-center justify-between gap-2 rounded-md border px-3 py-2 shadow-sm shadow-black/5 sm:h-9',\\n        Platform.select({\\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:hover:bg-input/50 w-fit whitespace-nowrap text-sm outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:shrink-0',\\n        }),\\n        props.disabled && 'opacity-50',\\n        size === 'sm' && 'h-8 py-2 sm:py-1.5',\\n        className\\n      )}\\n      {...props}>\\n      <>{children}</>\\n      <Icon as={ChevronDown} aria-hidden={true} className=\\\"text-muted-foreground size-4\\\" />\\n    </SelectPrimitive.Trigger>\\n  );\\n}\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction SelectContent({\\n  className,\\n  children,\\n  position = 'popper',\\n  portalHost,\\n  ...props\\n}: SelectPrimitive.ContentProps &\\n  React.RefAttributes<SelectPrimitive.ContentRef> & {\\n    className?: string;\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <SelectPrimitive.Portal hostName={portalHost}>\\n      <FullWindowOverlay>\\n        <SelectPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\\n          <TextClassContext.Provider value=\\\"text-popover-foreground\\\">\\n            <NativeOnlyAnimatedView className=\\\"z-50\\\" entering={FadeIn} exiting={FadeOut}>\\n              <SelectPrimitive.Content\\n                className={cn(\\n                  'bg-popover border-border relative z-50 min-w-[8rem] rounded-md border shadow-md shadow-black/5',\\n                  Platform.select({\\n                    web: cn(\\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-select-content-transform-origin) max-h-52 overflow-y-auto overflow-x-hidden',\\n                      props.side === 'bottom' && 'slide-in-from-top-2',\\n                      props.side === 'top' && 'slide-in-from-bottom-2'\\n                    ),\\n                    native: 'p-1',\\n                  }),\\n                  position === 'popper' &&\\n                  Platform.select({\\n                    web: cn(\\n                      props.side === 'bottom' && 'translate-y-1',\\n                      props.side === 'top' && '-translate-y-1'\\n                    ),\\n                  }),\\n                  className\\n                )}\\n                position={position}\\n                {...props}>\\n                <SelectScrollUpButton />\\n                <SelectPrimitive.Viewport\\n                  className={cn(\\n                    'p-1',\\n                    position === 'popper' &&\\n                    cn(\\n                      'w-full',\\n                      Platform.select({\\n                        web: 'h-[var(--radix-select-trigger-height)] min-w-[var(--radix-select-trigger-width)]',\\n                      })\\n                    )\\n                  )}>\\n                  {children}\\n                </SelectPrimitive.Viewport>\\n                <SelectScrollDownButton />\\n              </SelectPrimitive.Content>\\n            </NativeOnlyAnimatedView>\\n          </TextClassContext.Provider>\\n        </SelectPrimitive.Overlay>\\n      </FullWindowOverlay>\\n    </SelectPrimitive.Portal>\\n  );\\n}\\n\\nfunction SelectLabel({\\n  className,\\n  ...props\\n}: SelectPrimitive.LabelProps & React.RefAttributes<SelectPrimitive.LabelRef>) {\\n  return (\\n    <SelectPrimitive.Label\\n      className={cn('text-muted-foreground px-2 py-2 text-xs sm:py-1.5', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction SelectItem({\\n  className,\\n  ...props\\n}: Omit<SelectPrimitive.ItemProps, \\\"children\\\"> & React.RefAttributes<SelectPrimitive.ItemRef>) {\\n  return (\\n    <SelectPrimitive.Item\\n      className={cn(\\n        'active:bg-accent group relative flex w-full flex-row items-center gap-2 rounded-sm py-2 pl-2 pr-8 sm:py-1.5',\\n        Platform.select({\\n          web: 'focus:bg-accent focus:text-accent-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 cursor-default outline-none data-[disabled]:pointer-events-none [&_svg]:pointer-events-none',\\n        }),\\n        props.disabled && 'opacity-50',\\n        className\\n      )}\\n      {...props}>\\n      <View className=\\\"absolute right-2 flex size-3.5 items-center justify-center\\\">\\n        <SelectPrimitive.ItemIndicator>\\n          <Icon as={Check} className=\\\"text-muted-foreground size-4 shrink-0\\\" />\\n        </SelectPrimitive.ItemIndicator>\\n      </View>\\n      <SelectPrimitive.ItemText className=\\\"text-foreground group-active:text-accent-foreground select-none text-sm\\\" />\\n    </SelectPrimitive.Item>\\n  );\\n}\\n\\nfunction SelectSeparator({\\n  className,\\n  ...props\\n}: SelectPrimitive.SeparatorProps & React.RefAttributes<SelectPrimitive.SeparatorRef>) {\\n  return (\\n    <SelectPrimitive.Separator\\n      className={cn(\\n        'bg-border -mx-1 my-1 h-px',\\n        Platform.select({ web: 'pointer-events-none' }),\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\n/**\\n * @platform Web only\\n * Returns null on native platforms\\n */\\nfunction SelectScrollUpButton({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\\n  if (Platform.OS !== 'web') {\\n    return null;\\n  }\\n  return (\\n    <SelectPrimitive.ScrollUpButton\\n      className={cn('flex cursor-default items-center justify-center py-1', className)}\\n      {...props}>\\n      <Icon as={ChevronUpIcon} className=\\\"size-4\\\" />\\n    </SelectPrimitive.ScrollUpButton>\\n  );\\n}\\n\\n/**\\n * @platform Web only\\n * Returns null on native platforms\\n */\\nfunction SelectScrollDownButton({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\\n  if (Platform.OS !== 'web') {\\n    return null;\\n  }\\n  return (\\n    <SelectPrimitive.ScrollDownButton\\n      className={cn('flex cursor-default items-center justify-center py-1', className)}\\n      {...props}>\\n      <Icon as={ChevronDownIcon} className=\\\"size-4\\\" />\\n    </SelectPrimitive.ScrollDownButton>\\n  );\\n}\\n\\n\\nexport {\\n  Select,\\n  SelectContent,\\n  SelectGroup,\\n  SelectItem,\\n  SelectLabel,\\n  SelectScrollDownButton,\\n  SelectScrollUpButton,\\n  SelectSeparator,\\n  SelectTrigger,\\n  SelectValue,\\n  type Option,\\n};\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/separator.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"separator\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Separator\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Visually or semantically separates content.\",\n  \"dependencies\": [\n    \"@rn-primitives/separator\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/separator.tsx\",\n      \"content\": \"import { cn } from '@/registry/uniwind/lib/utils';\\nimport * as SeparatorPrimitive from '@rn-primitives/separator';\\n\\nfunction Separator({\\n  className,\\n  orientation = 'horizontal',\\n  decorative = true,\\n  ...props\\n}: SeparatorPrimitive.RootProps & React.RefAttributes<SeparatorPrimitive.RootRef>) {\\n  return (\\n    <SeparatorPrimitive.Root\\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}\\n\\nexport { Separator };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/sign-in-form-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"sign-in-form-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"Sign In Form (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for signing in using email and password or social providers with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/card.json\",\n    \"https://reactnativereusables.com/r/uniwind/input.json\",\n    \"https://reactnativereusables.com/r/uniwind/label.json\",\n    \"https://reactnativereusables.com/r/uniwind/separator.json\",\n    \"https://reactnativereusables.com/r/uniwind/social-connections-clerk.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/sign-in-form.tsx\",\n      \"content\": \"import { SocialConnections } from '@/registry/blocks/social-connections';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Separator } from '@/registry/nativewind/components/ui/separator';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { useSignIn } from '@clerk/clerk-expo';\\nimport * as React from 'react';\\nimport { Pressable, type TextInput, View } from 'react-native';\\n\\nexport function SignInForm() {\\n  const { signIn, setActive, isLoaded } = useSignIn();\\n  const [email, setEmail] = React.useState('');\\n  const [password, setPassword] = React.useState('');\\n  const passwordInputRef = React.useRef<TextInput>(null);\\n  const [error, setError] = React.useState<{ email?: string; password?: string }>({});\\n\\n  async function onSubmit() {\\n    if (!isLoaded) {\\n      return;\\n    }\\n\\n    // Start the sign-in process using the email and password provided\\n    try {\\n      const signInAttempt = await signIn.create({\\n        identifier: email,\\n        password,\\n      });\\n\\n      // If sign-in process is complete, set the created session as active\\n      // and redirect the user\\n      if (signInAttempt.status === 'complete') {\\n        setError({ email: '', password: '' });\\n        await setActive({ session: signInAttempt.createdSessionId });\\n        // TODO: If your app does not use `Stack.Protected`, navigate to your protected screen\\n        return;\\n      }\\n      // TODO: Handle other statuses\\n      console.error(JSON.stringify(signInAttempt, null, 2));\\n    } catch (err) {\\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\\n      if (err instanceof Error) {\\n        const isEmailMessage =\\n          err.message.toLowerCase().includes('identifier') ||\\n          err.message.toLowerCase().includes('email');\\n        setError(isEmailMessage ? { email: err.message } : { password: err.message });\\n        return;\\n      }\\n      console.error(JSON.stringify(err, null, 2));\\n    }\\n  }\\n\\n  function onEmailSubmitEditing() {\\n    passwordInputRef.current?.focus();\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Sign in to your app</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Welcome back! Please sign in to continue\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input\\n                id=\\\"email\\\"\\n                placeholder=\\\"m@example.com\\\"\\n                keyboardType=\\\"email-address\\\"\\n                autoComplete=\\\"email\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onChangeText={setEmail}\\n                onSubmitEditing={onEmailSubmitEditing}\\n                returnKeyType=\\\"next\\\"\\n                submitBehavior=\\\"submit\\\"\\n              />\\n              {error.email ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.email}</Text>\\n              ) : null}\\n            </View>\\n            <View className=\\\"gap-1.5\\\">\\n              <View className=\\\"flex-row items-center\\\">\\n                <Label htmlFor=\\\"password\\\">Password</Label>\\n                <Button\\n                  variant=\\\"link\\\"\\n                  size=\\\"sm\\\"\\n                  className=\\\"web:h-fit ml-auto h-4 px-1 py-0 sm:h-4\\\"\\n                  onPress={() => {\\n                    // TODO: Navigate to forgot password screen\\n                  }}>\\n                  <Text className=\\\"font-normal leading-4\\\">Forgot your password?</Text>\\n                </Button>\\n              </View>\\n              <Input\\n                ref={passwordInputRef}\\n                id=\\\"password\\\"\\n                secureTextEntry\\n                onChangeText={setPassword}\\n                returnKeyType=\\\"send\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n              {error.password ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.password}</Text>\\n              ) : null}\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Continue</Text>\\n            </Button>\\n          </View>\\n          <Text className=\\\"text-center text-sm\\\">\\n            Don&apos;t have an account?{' '}\\n            <Pressable\\n              onPress={() => {\\n                // TODO: Navigate to sign up screen\\n              }}>\\n              <Text className=\\\"text-sm underline underline-offset-4\\\">Sign up</Text>\\n            </Pressable>\\n          </Text>\\n          <View className=\\\"flex-row items-center\\\">\\n            <Separator className=\\\"flex-1\\\" />\\n            <Text className=\\\"text-muted-foreground px-4 text-sm\\\">or</Text>\\n            <Separator className=\\\"flex-1\\\" />\\n          </View>\\n          <SocialConnections />\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/sign-in-form.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"sign-in-form\",\n  \"type\": \"registry:component\",\n  \"title\": \"Sign In Form\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for signing in using email and password or social providers.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/card.json\",\n    \"https://reactnativereusables.com/r/uniwind/input.json\",\n    \"https://reactnativereusables.com/r/uniwind/label.json\",\n    \"https://reactnativereusables.com/r/uniwind/separator.json\",\n    \"https://reactnativereusables.com/r/uniwind/social-connections.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/sign-in-form.tsx\",\n      \"content\": \"import { SocialConnections } from '@/registry/blocks/social-connections';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Separator } from '@/registry/nativewind/components/ui/separator';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport * as React from 'react';\\nimport { Pressable, type TextInput, View } from 'react-native';\\n\\nexport function SignInForm() {\\n  const passwordInputRef = React.useRef<TextInput>(null);\\n\\n  function onEmailSubmitEditing() {\\n    passwordInputRef.current?.focus();\\n  }\\n\\n  function onSubmit() {\\n    // TODO: Submit form and navigate to protected screen if successful\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Sign in to your app</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Welcome back! Please sign in to continue\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input\\n                id=\\\"email\\\"\\n                placeholder=\\\"m@example.com\\\"\\n                keyboardType=\\\"email-address\\\"\\n                autoComplete=\\\"email\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onSubmitEditing={onEmailSubmitEditing}\\n                returnKeyType=\\\"next\\\"\\n                submitBehavior=\\\"submit\\\"\\n              />\\n            </View>\\n            <View className=\\\"gap-1.5\\\">\\n              <View className=\\\"flex-row items-center\\\">\\n                <Label htmlFor=\\\"password\\\">Password</Label>\\n                <Button\\n                  variant=\\\"link\\\"\\n                  size=\\\"sm\\\"\\n                  className=\\\"web:h-fit ml-auto h-4 px-1 py-0 sm:h-4\\\"\\n                  onPress={() => {\\n                    // TODO: Navigate to forgot password screen\\n                  }}>\\n                  <Text className=\\\"font-normal leading-4\\\">Forgot your password?</Text>\\n                </Button>\\n              </View>\\n              <Input\\n                ref={passwordInputRef}\\n                id=\\\"password\\\"\\n                secureTextEntry\\n                returnKeyType=\\\"send\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Continue</Text>\\n            </Button>\\n          </View>\\n          <Text className=\\\"text-center text-sm\\\">\\n            Don&apos;t have an account?{' '}\\n            <Pressable\\n              onPress={() => {\\n                // TODO: Navigate to sign up screen\\n              }}>\\n              <Text className=\\\"text-sm underline underline-offset-4\\\">Sign up</Text>\\n            </Pressable>\\n          </Text>\\n          <View className=\\\"flex-row items-center\\\">\\n            <Separator className=\\\"flex-1\\\" />\\n            <Text className=\\\"text-muted-foreground px-4 text-sm\\\">or</Text>\\n            <Separator className=\\\"flex-1\\\" />\\n          </View>\\n          <SocialConnections />\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/sign-up-form-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"sign-up-form-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"Sign Up Form (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for creating an account with email and password or social providers with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/card.json\",\n    \"https://reactnativereusables.com/r/uniwind/input.json\",\n    \"https://reactnativereusables.com/r/uniwind/label.json\",\n    \"https://reactnativereusables.com/r/uniwind/separator.json\",\n    \"https://reactnativereusables.com/r/uniwind/social-connections-clerk.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/sign-up-form.tsx\",\n      \"content\": \"import { SocialConnections } from '@/registry/blocks/social-connections';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Separator } from '@/registry/nativewind/components/ui/separator';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { useSignUp } from '@clerk/clerk-expo';\\nimport * as React from 'react';\\nimport { Pressable, TextInput, View } from 'react-native';\\n\\nexport function SignUpForm() {\\n  const { signUp, isLoaded } = useSignUp();\\n  const [email, setEmail] = React.useState('');\\n  const [password, setPassword] = React.useState('');\\n  const passwordInputRef = React.useRef<TextInput>(null);\\n  const [error, setError] = React.useState<{ email?: string; password?: string }>({});\\n\\n  async function onSubmit() {\\n    if (!isLoaded) return;\\n\\n    // Start sign-up process using email and password provided\\n    try {\\n      await signUp.create({\\n        emailAddress: email,\\n        password,\\n      });\\n\\n      // Send user an email with verification code\\n      await signUp.prepareEmailAddressVerification({ strategy: 'email_code' });\\n\\n      // TODO: Navigate to verify email screen to capture OTP code\\n    } catch (err) {\\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\\n      if (err instanceof Error) {\\n        const isEmailMessage =\\n          err.message.toLowerCase().includes('identifier') ||\\n          err.message.toLowerCase().includes('email');\\n        setError(isEmailMessage ? { email: err.message } : { password: err.message });\\n        return;\\n      }\\n      console.error(JSON.stringify(err, null, 2));\\n    }\\n  }\\n\\n  function onEmailSubmitEditing() {\\n    passwordInputRef.current?.focus();\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Create your account</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Welcome! Please fill in the details to get started.\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input\\n                id=\\\"email\\\"\\n                placeholder=\\\"m@example.com\\\"\\n                keyboardType=\\\"email-address\\\"\\n                autoComplete=\\\"email\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onChangeText={setEmail}\\n                onSubmitEditing={onEmailSubmitEditing}\\n                returnKeyType=\\\"next\\\"\\n                submitBehavior=\\\"submit\\\"\\n              />\\n              {error.email ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.email}</Text>\\n              ) : null}\\n            </View>\\n            <View className=\\\"gap-1.5\\\">\\n              <View className=\\\"flex-row items-center\\\">\\n                <Label htmlFor=\\\"password\\\">Password</Label>\\n              </View>\\n              <Input\\n                ref={passwordInputRef}\\n                id=\\\"password\\\"\\n                secureTextEntry\\n                onChangeText={setPassword}\\n                returnKeyType=\\\"send\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n              {error.password ? (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error.password}</Text>\\n              ) : null}\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Continue</Text>\\n            </Button>\\n          </View>\\n          <Text className=\\\"text-center text-sm\\\">\\n            Already have an account?{' '}\\n            <Pressable\\n              onPress={() => {\\n                // TODO: Navigate to sign in screen\\n              }}>\\n              <Text className=\\\"text-sm underline underline-offset-4\\\">Sign in</Text>\\n            </Pressable>\\n          </Text>\\n          <View className=\\\"flex-row items-center\\\">\\n            <Separator className=\\\"flex-1\\\" />\\n            <Text className=\\\"text-muted-foreground px-4 text-sm\\\">or</Text>\\n            <Separator className=\\\"flex-1\\\" />\\n          </View>\\n          <SocialConnections />\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/sign-up-form.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"sign-up-form\",\n  \"type\": \"registry:component\",\n  \"title\": \"Sign Up Form\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for creating an account with email and password or social providers.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/card.json\",\n    \"https://reactnativereusables.com/r/uniwind/input.json\",\n    \"https://reactnativereusables.com/r/uniwind/label.json\",\n    \"https://reactnativereusables.com/r/uniwind/separator.json\",\n    \"https://reactnativereusables.com/r/uniwind/social-connections.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/sign-up-form.tsx\",\n      \"content\": \"import { SocialConnections } from '@/registry/blocks/social-connections';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Separator } from '@/registry/nativewind/components/ui/separator';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport * as React from 'react';\\nimport { Pressable, TextInput, View } from 'react-native';\\n\\nexport function SignUpForm() {\\n  const passwordInputRef = React.useRef<TextInput>(null);\\n\\n  function onEmailSubmitEditing() {\\n    passwordInputRef.current?.focus();\\n  }\\n\\n  function onSubmit() {\\n    // TODO: Submit form and navigate to protected screen if successful\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Create your account</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Welcome! Please fill in the details to get started.\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"email\\\">Email</Label>\\n              <Input\\n                id=\\\"email\\\"\\n                placeholder=\\\"m@example.com\\\"\\n                keyboardType=\\\"email-address\\\"\\n                autoComplete=\\\"email\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onSubmitEditing={onEmailSubmitEditing}\\n                returnKeyType=\\\"next\\\"\\n                submitBehavior=\\\"submit\\\"\\n              />\\n            </View>\\n            <View className=\\\"gap-1.5\\\">\\n              <View className=\\\"flex-row items-center\\\">\\n                <Label htmlFor=\\\"password\\\">Password</Label>\\n              </View>\\n              <Input\\n                ref={passwordInputRef}\\n                id=\\\"password\\\"\\n                secureTextEntry\\n                returnKeyType=\\\"send\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n            </View>\\n            <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n              <Text>Continue</Text>\\n            </Button>\\n          </View>\\n          <Text className=\\\"text-center text-sm\\\">\\n            Already have an account?{' '}\\n            <Pressable\\n              onPress={() => {\\n                // TODO: Navigate to sign in screen\\n              }}>\\n              <Text className=\\\"text-sm underline underline-offset-4\\\">Sign in</Text>\\n            </Pressable>\\n          </Text>\\n          <View className=\\\"flex-row items-center\\\">\\n            <Separator className=\\\"flex-1\\\" />\\n            <Text className=\\\"text-muted-foreground px-4 text-sm\\\">or</Text>\\n            <Separator className=\\\"flex-1\\\" />\\n          </View>\\n          <SocialConnections />\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/skeleton.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"skeleton\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Skeleton\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Use to show a placeholder while content is loading.\",\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/skeleton.tsx\",\n      \"content\": \"import { cn } from '@/registry/uniwind/lib/utils';\\nimport { View } from 'react-native';\\nimport Animated, {\\n  useAnimatedStyle,\\n  useSharedValue,\\n  withRepeat,\\n  withTiming,\\n} from 'react-native-reanimated';\\nimport * as React from 'react';\\n\\nconst duration = 1000;\\n\\nfunction Skeleton({\\n  className,\\n  ...props\\n}: React.ComponentProps<typeof View> & React.RefAttributes<View>) {\\n  const sv = useSharedValue(1);\\n\\n  React.useEffect(() => {\\n    sv.value = withRepeat(withTiming(0.5, { duration }), -1, true);\\n  }, []);\\n\\n  const style = useAnimatedStyle(\\n    () => ({\\n      opacity: sv.value,\\n    }),\\n    [sv]\\n  );\\n  return (\\n    <Animated.View\\n      style={style}\\n      className={cn('bg-secondary dark:bg-muted rounded-md', className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Skeleton };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/social-connections-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"social-connections-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"Social Connections (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A set of buttons for authenticating through social providers with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\",\n    \"expo-auth-session\",\n    \"expo-web-browser\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/social-connections.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport { useSSO, type StartSSOFlowParams } from '@clerk/clerk-expo';\\nimport * as AuthSession from 'expo-auth-session';\\nimport * as WebBrowser from 'expo-web-browser';\\nimport { useColorScheme } from 'nativewind';\\nimport * as React from 'react';\\nimport { Image, Platform, View, type ImageSourcePropType } from 'react-native';\\n\\nWebBrowser.maybeCompleteAuthSession();\\n\\ntype SocialConnectionStrategy = Extract<\\n  StartSSOFlowParams['strategy'],\\n  'oauth_google' | 'oauth_github' | 'oauth_apple'\\n>;\\n\\nconst SOCIAL_CONNECTION_STRATEGIES: {\\n  type: SocialConnectionStrategy;\\n  source: ImageSourcePropType;\\n  useTint?: boolean;\\n}[] = [\\n  {\\n    type: 'oauth_apple',\\n    source: { uri: 'https://img.clerk.com/static/apple.png?width=160' },\\n    useTint: true,\\n  },\\n  {\\n    type: 'oauth_google',\\n    source: { uri: 'https://img.clerk.com/static/google.png?width=160' },\\n    useTint: false,\\n  },\\n  {\\n    type: 'oauth_github',\\n    source: { uri: 'https://img.clerk.com/static/github.png?width=160' },\\n    useTint: true,\\n  },\\n];\\n\\nexport function SocialConnections() {\\n  useWarmUpBrowser();\\n  const { colorScheme } = useColorScheme();\\n  const { startSSOFlow } = useSSO();\\n\\n  function onSocialLoginPress(strategy: SocialConnectionStrategy) {\\n    return async () => {\\n      try {\\n        // Start the authentication process by calling `startSSOFlow()`\\n        const { createdSessionId, setActive, signIn } = await startSSOFlow({\\n          strategy,\\n          // For web, defaults to current path\\n          // For native, you must pass a scheme, like AuthSession.makeRedirectUri({ scheme, path })\\n          // For more info, see https://docs.expo.dev/versions/latest/sdk/auth-session/#authsessionmakeredirecturioptions\\n          redirectUrl: AuthSession.makeRedirectUri(),\\n        });\\n\\n        // If sign in was successful, set the active session\\n        if (createdSessionId && setActive) {\\n          setActive({ session: createdSessionId });\\n          // TODO: If your app does not use `Stack.Protected`, redirect authenticated users to your protected screen\\n          return;\\n        }\\n\\n        // TODO: Handle other statuses\\n        // If there is no `createdSessionId`,\\n        // there are missing requirements, such as MFA\\n        // Use the `signIn` or `signUp` returned from `startSSOFlow`\\n        // to handle next steps\\n      } catch (err) {\\n        // See https://go.clerk.com/mRUDrIe for more info on error handling\\n        console.error(JSON.stringify(err, null, 2));\\n      }\\n    };\\n  }\\n\\n  return (\\n    <View className=\\\"gap-2 sm:flex-row sm:gap-3\\\">\\n      {SOCIAL_CONNECTION_STRATEGIES.map((strategy) => {\\n        return (\\n          <Button\\n            key={strategy.type}\\n            variant=\\\"outline\\\"\\n            size=\\\"sm\\\"\\n            className=\\\"sm:flex-1\\\"\\n            onPress={onSocialLoginPress(strategy.type)}>\\n            <Image\\n              className={cn('size-4', strategy.useTint && Platform.select({ web: 'dark:invert' }))}\\n              tintColor={Platform.select({\\n                native: strategy.useTint ? (colorScheme === 'dark' ? 'white' : 'black') : undefined,\\n              })}\\n              source={strategy.source}\\n            />\\n          </Button>\\n        );\\n      })}\\n    </View>\\n  );\\n}\\n\\nconst useWarmUpBrowser = Platform.select({\\n  web: () => {},\\n  default: () => {\\n    React.useEffect(() => {\\n      // Preloads the browser for Android devices to reduce authentication load time\\n      // See: https://docs.expo.dev/guides/authentication/#improving-user-experience\\n      void WebBrowser.warmUpAsync();\\n      return () => {\\n        // Cleanup: closes browser when component unmounts\\n        void WebBrowser.coolDownAsync();\\n      };\\n    }, []);\\n  },\\n});\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/social-connections.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"social-connections\",\n  \"type\": \"registry:component\",\n  \"title\": \"Social Connections\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A set of buttons for authenticating through social providers.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/social-connections.tsx\",\n      \"content\": \"import { cn } from '@/registry/nativewind/lib/utils';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport { useColorScheme } from 'nativewind';\\nimport { Image, Platform, View } from 'react-native';\\n\\nconst SOCIAL_CONNECTION_STRATEGIES = [\\n  {\\n    type: 'oauth_apple',\\n    source: { uri: 'https://img.clerk.com/static/apple.png?width=160' },\\n    useTint: true,\\n  },\\n  {\\n    type: 'oauth_google',\\n    source: { uri: 'https://img.clerk.com/static/google.png?width=160' },\\n    useTint: false,\\n  },\\n  {\\n    type: 'oauth_github',\\n    source: { uri: 'https://img.clerk.com/static/github.png?width=160' },\\n    useTint: true,\\n  },\\n];\\n\\nexport function SocialConnections() {\\n  const { colorScheme } = useColorScheme();\\n\\n  return (\\n    <View className=\\\"gap-2 sm:flex-row sm:gap-3\\\">\\n      {SOCIAL_CONNECTION_STRATEGIES.map((strategy) => {\\n        return (\\n          <Button\\n            key={strategy.type}\\n            variant=\\\"outline\\\"\\n            size=\\\"sm\\\"\\n            className=\\\"sm:flex-1\\\"\\n            onPress={() => {\\n              // TODO: Authenticate with social provider and navigate to protected screen if successful\\n            }}>\\n            <Image\\n              className={cn('size-4', strategy.useTint && Platform.select({ web: 'dark:invert' }))}\\n              tintColor={Platform.select({\\n                native: strategy.useTint ? (colorScheme === 'dark' ? 'white' : 'black') : undefined,\\n              })}\\n              source={strategy.source}\\n            />\\n          </Button>\\n        );\\n      })}\\n    </View>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/switch.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"switch\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Switch\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A control that allows the user to toggle between checked and not checked.\",\n  \"dependencies\": [\n    \"@rn-primitives/switch\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/switch.tsx\",\n      \"content\": \"import { cn } from '@/registry/uniwind/lib/utils';\\nimport * as SwitchPrimitives from '@rn-primitives/switch';\\nimport { Platform } from 'react-native';\\n\\nfunction Switch({\\n  className,\\n  ...props\\n}: SwitchPrimitives.RootProps & React.RefAttributes<SwitchPrimitives.RootRef>) {\\n  return (\\n    <SwitchPrimitives.Root\\n      className={cn(\\n        'flex h-[1.15rem] w-8 shrink-0 flex-row items-center rounded-full border border-transparent shadow-sm shadow-black/5',\\n        Platform.select({\\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 peer inline-flex outline-none transition-all focus-visible:ring-[3px] disabled:cursor-not-allowed',\\n        }),\\n        props.checked ? 'bg-primary' : 'bg-input dark:bg-input/80',\\n        props.disabled && 'opacity-50',\\n        className\\n      )}\\n      {...props}>\\n      <SwitchPrimitives.Thumb\\n        className={cn(\\n          'bg-background size-4 rounded-full transition-transform',\\n          Platform.select({\\n            web: 'pointer-events-none block ring-0',\\n          }),\\n          props.checked\\n            ? 'dark:bg-primary-foreground translate-x-3.5'\\n            : 'dark:bg-foreground translate-x-0'\\n        )}\\n      />\\n    </SwitchPrimitives.Root>\\n  );\\n}\\n\\nexport { Switch };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/tabs.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"tabs\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Tabs\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A set of layered sections of content—known as tab panels—that are displayed one at a time.\",\n  \"dependencies\": [\n    \"@rn-primitives/tabs\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/tabs.tsx\",\n      \"content\": \"import { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as TabsPrimitive from '@rn-primitives/tabs';\\nimport { Platform } from 'react-native';\\n\\nfunction Tabs({\\n  className,\\n  ...props\\n}: TabsPrimitive.RootProps & React.RefAttributes<TabsPrimitive.RootRef>) {\\n  return <TabsPrimitive.Root className={cn('flex flex-col gap-2', className)} {...props} />;\\n}\\n\\nfunction TabsList({\\n  className,\\n  ...props\\n}: TabsPrimitive.ListProps & React.RefAttributes<TabsPrimitive.ListRef>) {\\n  return (\\n    <TabsPrimitive.List\\n      className={cn(\\n        'bg-muted flex h-9 flex-row items-center justify-center rounded-lg p-[3px]',\\n        Platform.select({ web: 'inline-flex w-fit', native: 'mr-auto' }),\\n        className\\n      )}\\n      {...props}\\n    />\\n  );\\n}\\n\\nfunction TabsTrigger({\\n  className,\\n  ...props\\n}: TabsPrimitive.TriggerProps & React.RefAttributes<TabsPrimitive.TriggerRef>) {\\n  const { value } = TabsPrimitive.useRootContext();\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-foreground dark:text-muted-foreground text-sm font-medium',\\n        value === props.value && 'dark:text-foreground'\\n      )}>\\n      <TabsPrimitive.Trigger\\n        className={cn(\\n          'flex flex-row items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 shadow-none shadow-black/5',\\n          Platform.select({\\n            web: 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring web:h-[calc(100%-1px)] inline-flex cursor-default whitespace-nowrap transition-[color,box-shadow] focus-visible:outline-1 focus-visible:ring-[3px] disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0',\\n          }),\\n          props.disabled && 'opacity-50',\\n          props.value === value && 'bg-background dark:border-foreground/10 dark:bg-input/30',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction TabsContent({\\n  className,\\n  ...props\\n}: TabsPrimitive.ContentProps & React.RefAttributes<TabsPrimitive.ContentRef>) {\\n  return (\\n    <TabsPrimitive.Content\\n      className={cn(Platform.select({ web: 'flex-1 outline-none' }), className)}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Tabs, TabsContent, TabsList, TabsTrigger };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/text.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"text\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Text\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A component for displaying text.\",\n  \"dependencies\": [\n    \"@rn-primitives/slot\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n      \"content\": \"import { cn } from '@/registry/uniwind/lib/utils';\\nimport * as Slot from '@rn-primitives/slot';\\nimport { cva, type VariantProps } from 'class-variance-authority';\\nimport * as React from 'react';\\nimport { Platform, Text as RNText, type Role } from 'react-native';\\n\\nconst textVariants = cva(\\n  cn(\\n    'text-foreground text-base',\\n    Platform.select({\\n      web: 'select-text',\\n    })\\n  ),\\n  {\\n    variants: {\\n      variant: {\\n        default: '',\\n        h1: cn(\\n          'text-center text-4xl font-extrabold tracking-tight',\\n          Platform.select({ web: 'scroll-m-20 text-balance' })\\n        ),\\n        h2: cn(\\n          'border-border border-b pb-2 text-3xl font-semibold tracking-tight',\\n          Platform.select({ web: 'scroll-m-20 first:mt-0' })\\n        ),\\n        h3: cn('text-2xl font-semibold tracking-tight', Platform.select({ web: 'scroll-m-20' })),\\n        h4: cn('text-xl font-semibold tracking-tight', Platform.select({ web: 'scroll-m-20' })),\\n        p: 'mt-3 leading-7 sm:mt-6',\\n        blockquote: 'mt-4 border-l-2 pl-3 italic sm:mt-6 sm:pl-6',\\n        code: cn(\\n          'bg-muted relative rounded px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold'\\n        ),\\n        lead: 'text-muted-foreground text-xl',\\n        large: 'text-lg font-semibold',\\n        small: 'text-sm font-medium leading-none',\\n        muted: 'text-muted-foreground text-sm',\\n      },\\n    },\\n    defaultVariants: {\\n      variant: 'default',\\n    },\\n  }\\n);\\n\\ntype TextVariantProps = VariantProps<typeof textVariants>;\\n\\ntype TextVariant = NonNullable<TextVariantProps['variant']>;\\n\\nconst ROLE: Partial<Record<TextVariant, Role>> = {\\n  h1: 'heading',\\n  h2: 'heading',\\n  h3: 'heading',\\n  h4: 'heading',\\n  blockquote: Platform.select({ web: 'blockquote' as Role }),\\n  code: Platform.select({ web: 'code' as Role }),\\n};\\n\\nconst ARIA_LEVEL: Partial<Record<TextVariant, string>> = {\\n  h1: '1',\\n  h2: '2',\\n  h3: '3',\\n  h4: '4',\\n};\\n\\nconst TextClassContext = React.createContext<string | undefined>(undefined);\\n\\nfunction Text({\\n  className,\\n  asChild = false,\\n  variant = 'default',\\n  ...props\\n}: React.ComponentProps<typeof RNText> &\\n  TextVariantProps &\\n  React.RefAttributes<RNText> & {\\n    asChild?: boolean;\\n  }) {\\n  const textClass = React.useContext(TextClassContext);\\n  const Component = asChild ? Slot.Text : RNText;\\n  return (\\n    <Component\\n      className={cn(textVariants({ variant }), textClass, className)}\\n      role={variant ? ROLE[variant] : undefined}\\n      aria-level={variant ? ARIA_LEVEL[variant] : undefined}\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Text, TextClassContext };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/textarea.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"textarea\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Textarea\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"Displays a form textarea or a component that looks like a textarea.\",\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/textarea.tsx\",\n      \"content\": \"import { cn } from '@/registry/uniwind/lib/utils';\\nimport { Platform, TextInput, type TextInputProps } from 'react-native';\\n\\nfunction Textarea({\\n  className,\\n  multiline = true,\\n  numberOfLines = Platform.select({ web: 2, native: 8 }), // On web, numberOfLines also determines initial height. On native, it determines the maximum height.\\n  placeholderClassName,\\n  ...props\\n}: TextInputProps & React.RefAttributes<TextInput>) {\\n  return (\\n    <TextInput\\n      className={cn(\\n        'text-foreground border-input dark:bg-input/30 flex min-h-16 w-full flex-row rounded-md border bg-transparent px-3 py-2 text-base shadow-sm shadow-black/5 md:text-sm',\\n        Platform.select({\\n          web: 'placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive field-sizing-content resize-y outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed',\\n        }),\\n        props.editable === false && 'opacity-50',\\n        className\\n      )}\\n      placeholderClassName={cn('text-muted-foreground', placeholderClassName)}\\n      multiline={multiline}\\n      numberOfLines={numberOfLines}\\n      textAlignVertical=\\\"top\\\"\\n      {...props}\\n    />\\n  );\\n}\\n\\nexport { Textarea };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/toggle-group.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"toggle-group\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Toggle Group\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A set of two-state buttons that can be toggled on or off.\",\n  \"dependencies\": [\n    \"@rn-primitives/toggle-group\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\",\n    \"https://reactnativereusables.com/r/uniwind/icon.json\",\n    \"https://reactnativereusables.com/r/uniwind/toggle.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/toggle-group.tsx\",\n      \"content\": \"import { Icon } from '@/registry/uniwind/components/ui/icon';\\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { toggleVariants } from '@/registry/uniwind/components/ui/toggle';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as ToggleGroupPrimitive from '@rn-primitives/toggle-group';\\nimport type { VariantProps } from 'class-variance-authority';\\nimport * as React from 'react';\\nimport { Platform } from 'react-native';\\n\\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants> | null>(null);\\n\\nfunction ToggleGroup({\\n  className,\\n  variant,\\n  size,\\n  children,\\n  ...props\\n}: ToggleGroupPrimitive.RootProps &\\n  VariantProps<typeof toggleVariants> &\\n  React.RefAttributes<ToggleGroupPrimitive.RootRef>) {\\n  return (\\n    <ToggleGroupPrimitive.Root\\n      className={cn(\\n        'flex flex-row items-center rounded-md shadow-none',\\n        Platform.select({ web: 'w-fit' }),\\n        variant === 'outline' && 'shadow-sm shadow-black/5',\\n        className\\n      )}\\n      {...props}>\\n      <ToggleGroupContext.Provider value={{ variant, size }}>\\n        {children}\\n      </ToggleGroupContext.Provider>\\n    </ToggleGroupPrimitive.Root>\\n  );\\n}\\n\\nfunction useToggleGroupContext() {\\n  const context = React.useContext(ToggleGroupContext);\\n  if (context === null) {\\n    throw new Error(\\n      'ToggleGroup compound components cannot be rendered outside the ToggleGroup component'\\n    );\\n  }\\n  return context;\\n}\\n\\nfunction ToggleGroupItem({\\n  className,\\n  children,\\n  variant,\\n  size,\\n  isFirst,\\n  isLast,\\n  ...props\\n}: ToggleGroupPrimitive.ItemProps &\\n  VariantProps<typeof toggleVariants> &\\n  React.RefAttributes<ToggleGroupPrimitive.ItemRef> & {\\n    isFirst?: boolean;\\n    isLast?: boolean;\\n  }) {\\n  const context = useToggleGroupContext();\\n  const { value } = ToggleGroupPrimitive.useRootContext();\\n\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm text-foreground font-medium',\\n        ToggleGroupPrimitive.utils.getIsSelected(value, props.value)\\n          ? 'text-accent-foreground'\\n          : Platform.select({ web: 'group-hover:text-muted-foreground' })\\n      )}>\\n      <ToggleGroupPrimitive.Item\\n        className={cn(\\n          toggleVariants({\\n            variant: context.variant || variant,\\n            size: context.size || size,\\n          }),\\n          props.disabled && 'opacity-50',\\n          ToggleGroupPrimitive.utils.getIsSelected(value, props.value) && 'bg-accent',\\n          'min-w-0 shrink-0 rounded-none shadow-none',\\n          isFirst && 'rounded-l-md',\\n          isLast && 'rounded-r-md',\\n          (context.variant === 'outline' || variant === 'outline') && 'border-l-0',\\n          (context.variant === 'outline' || variant === 'outline') && isFirst && 'border-l',\\n          Platform.select({\\n            web: 'flex-1 focus:z-10 focus-visible:z-10',\\n          }),\\n          className\\n        )}\\n        {...props}>\\n        {children}\\n      </ToggleGroupPrimitive.Item>\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction ToggleGroupIcon({ className, ...props }: React.ComponentProps<typeof Icon>) {\\n  const textClass = React.useContext(TextClassContext);\\n  return <Icon className={cn('size-4 shrink-0', textClass, className)} {...props} />;\\n}\\n\\nexport { ToggleGroup, ToggleGroupIcon, ToggleGroupItem };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/toggle.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"toggle\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Toggle\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A two-state button that can be either on or off.\",\n  \"dependencies\": [\n    \"@rn-primitives/toggle\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\",\n    \"https://reactnativereusables.com/r/uniwind/icon.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/toggle.tsx\",\n      \"content\": \"import { Icon } from '@/registry/uniwind/components/ui/icon';\\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as TogglePrimitive from '@rn-primitives/toggle';\\nimport { cva, type VariantProps } from 'class-variance-authority';\\nimport * as React from 'react';\\nimport { Platform } from 'react-native';\\n\\nconst toggleVariants = cva(\\n  cn(\\n    'active:bg-muted group flex flex-row items-center justify-center gap-2 rounded-md',\\n    Platform.select({\\n      web: 'hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex cursor-default whitespace-nowrap outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:pointer-events-none [&_svg]:pointer-events-none',\\n    })\\n  ),\\n  {\\n    variants: {\\n      variant: {\\n        default: 'bg-transparent',\\n        outline: cn(\\n          'border-input active:bg-accent border bg-transparent shadow-sm shadow-black/5',\\n          Platform.select({\\n            web: 'hover:bg-accent hover:text-accent-foreground',\\n          })\\n        ),\\n      },\\n      size: {\\n        default: 'h-10 min-w-10 px-2.5 sm:h-9 sm:min-w-9 sm:px-2',\\n        sm: 'h-9 min-w-9 px-2 sm:h-8 sm:min-w-8 sm:px-1.5',\\n        lg: 'h-11 min-w-11 px-3 sm:h-10 sm:min-w-10 sm:px-2.5',\\n      },\\n    },\\n    defaultVariants: {\\n      variant: 'default',\\n      size: 'default',\\n    },\\n  }\\n);\\n\\nfunction Toggle({\\n  className,\\n  variant,\\n  size,\\n  ...props\\n}: TogglePrimitive.RootProps &\\n  VariantProps<typeof toggleVariants> &\\n  React.RefAttributes<TogglePrimitive.RootRef>) {\\n  return (\\n    <TextClassContext.Provider\\n      value={cn(\\n        'text-sm text-foreground font-medium',\\n        props.pressed\\n          ? 'text-accent-foreground'\\n          : Platform.select({ web: 'group-hover:text-muted-foreground' }),\\n        className\\n      )}>\\n      <TogglePrimitive.Root\\n        className={cn(\\n          toggleVariants({ variant, size }),\\n          props.disabled && 'opacity-50',\\n          props.pressed && 'bg-accent',\\n          className\\n        )}\\n        {...props}\\n      />\\n    </TextClassContext.Provider>\\n  );\\n}\\n\\nfunction ToggleIcon({ className, ...props }: React.ComponentProps<typeof Icon>) {\\n  const textClass = React.useContext(TextClassContext);\\n  return <Icon className={cn('size-4 shrink-0', textClass, className)} {...props} />;\\n}\\n\\nexport { Toggle, ToggleIcon, toggleVariants };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/tooltip.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"tooltip\",\n  \"type\": \"registry:ui\",\n  \"title\": \"Tooltip\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A popup that displays information related to an element when the element receives keyboard focus, the mouse hovers over it, or when it is pressed.\",\n  \"dependencies\": [\n    \"@rn-primitives/tooltip\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/text.json\",\n    \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/tooltip.tsx\",\n      \"content\": \"import { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\\nimport { cn } from '@/registry/uniwind/lib/utils';\\nimport * as TooltipPrimitive from '@rn-primitives/tooltip';\\nimport * as React from 'react';\\nimport { Platform, StyleSheet } from 'react-native';\\nimport { FadeInDown, FadeInUp, FadeOut } from 'react-native-reanimated';\\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\\n\\nconst Tooltip = TooltipPrimitive.Root;\\n\\nconst TooltipTrigger = TooltipPrimitive.Trigger;\\n\\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\\n\\nfunction TooltipContent({\\n  className,\\n  sideOffset = 4,\\n  portalHost,\\n  side = 'top',\\n  ...props\\n}: TooltipPrimitive.ContentProps &\\n  React.RefAttributes<TooltipPrimitive.ContentRef> & {\\n    portalHost?: string;\\n  }) {\\n  return (\\n    <TooltipPrimitive.Portal hostName={portalHost}>\\n      <FullWindowOverlay>\\n        <TooltipPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\\n          <NativeOnlyAnimatedView\\n            entering={\\n              side === 'top'\\n                ? FadeInDown.withInitialValues({ transform: [{ translateY: 3 }] }).duration(150)\\n                : FadeInUp.withInitialValues({ transform: [{ translateY: -5 }] })\\n            }\\n            exiting={FadeOut}>\\n            <TextClassContext.Provider value=\\\"text-xs text-primary-foreground\\\">\\n              <TooltipPrimitive.Content\\n                sideOffset={sideOffset}\\n                className={cn(\\n                  'bg-primary z-50 rounded-md px-3 py-2 sm:py-1.5',\\n                  Platform.select({\\n                    web: cn(\\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-tooltip-content-transform-origin) w-fit text-balance',\\n                      side === 'bottom' && 'slide-in-from-top-2',\\n                      side === 'left' && 'slide-in-from-right-2',\\n                      side === 'right' && 'slide-in-from-left-2',\\n                      side === 'top' && 'slide-in-from-bottom-2'\\n                    ),\\n                  }),\\n                  className\\n                )}\\n                side={side}\\n                {...props}\\n              />\\n            </TextClassContext.Provider>\\n          </NativeOnlyAnimatedView>\\n        </TooltipPrimitive.Overlay>\\n      </FullWindowOverlay>\\n    </TooltipPrimitive.Portal>\\n  );\\n}\\n\\nexport { Tooltip, TooltipContent, TooltipTrigger };\\n\",\n      \"type\": \"registry:ui\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/user-menu-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"user-menu-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"User Menu (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A popover menu presenting options and actions for the current user with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/avatar.json\",\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/icon.json\",\n    \"https://reactnativereusables.com/r/uniwind/popover.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/user-menu.tsx\",\n      \"content\": \"import { Avatar, AvatarFallback, AvatarImage } from '@/registry/nativewind/components/ui/avatar';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport {\\n  Popover,\\n  PopoverContent,\\n  PopoverTrigger,\\n} from '@/registry/nativewind/components/ui/popover';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { useAuth, useUser } from '@clerk/clerk-expo';\\nimport type { TriggerRef } from '@rn-primitives/popover';\\nimport { LogOutIcon, PlusIcon, SettingsIcon } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport { View } from 'react-native';\\n\\nexport function UserMenu() {\\n  const { user } = useUser();\\n  const { signOut } = useAuth();\\n  const popoverTriggerRef = React.useRef<TriggerRef>(null);\\n\\n  async function onSignOut() {\\n    popoverTriggerRef.current?.close();\\n    await signOut();\\n    // TODO: If your app does not use `Stack.Protected`, navigate to your sign-in screen\\n  }\\n\\n  return (\\n    <Popover>\\n      <PopoverTrigger asChild ref={popoverTriggerRef}>\\n        <Button variant=\\\"ghost\\\" size=\\\"icon\\\" className=\\\"size-8 rounded-full\\\">\\n          <UserAvatar />\\n        </Button>\\n      </PopoverTrigger>\\n      <PopoverContent align=\\\"end\\\" side=\\\"bottom\\\" className=\\\"w-80 p-0\\\">\\n        <View className=\\\"border-border gap-3 border-b p-3\\\">\\n          <View className=\\\"flex-row items-center gap-3\\\">\\n            <UserAvatar className=\\\"size-10\\\" />\\n            <View className=\\\"flex-1\\\">\\n              <Text className=\\\"font-medium leading-5\\\">\\n                {user?.fullName || user?.emailAddresses[0]?.emailAddress}\\n              </Text>\\n              {user?.fullName?.length ? (\\n                <Text className=\\\"text-muted-foreground text-sm font-normal leading-4\\\">\\n                  {user?.username || user?.emailAddresses[0]?.emailAddress}\\n                </Text>\\n              ) : null}\\n            </View>\\n          </View>\\n          <View className=\\\"flex-row flex-wrap gap-3 py-0.5\\\">\\n            <Button\\n              variant=\\\"outline\\\"\\n              size=\\\"sm\\\"\\n              onPress={() => {\\n                // TODO: Navigate to account settings screen\\n              }}>\\n              <Icon as={SettingsIcon} className=\\\"size-4\\\" />\\n              <Text>Manage Account</Text>\\n            </Button>\\n            <Button variant=\\\"outline\\\" size=\\\"sm\\\" className=\\\"flex-1\\\" onPress={onSignOut}>\\n              <Icon as={LogOutIcon} className=\\\"size-4\\\" />\\n              <Text>Sign Out</Text>\\n            </Button>\\n          </View>\\n        </View>\\n        <Button\\n          variant=\\\"ghost\\\"\\n          size=\\\"lg\\\"\\n          className=\\\"h-16 justify-start gap-3 rounded-none rounded-b-md px-3 sm:h-14\\\"\\n          onPress={() => {\\n            // TODO: Navigate to add account screen\\n          }}>\\n          <View className=\\\"size-10 items-center justify-center\\\">\\n            <View className=\\\"border-border bg-muted/50 size-7 items-center justify-center rounded-full border border-dashed\\\">\\n              <Icon as={PlusIcon} className=\\\"size-5\\\" />\\n            </View>\\n          </View>\\n          <Text>Add account</Text>\\n        </Button>\\n      </PopoverContent>\\n    </Popover>\\n  );\\n}\\n\\nfunction UserAvatar(props: Omit<React.ComponentProps<typeof Avatar>, 'alt'>) {\\n  const { user } = useUser();\\n\\n  const { initials, imageSource, userName } = React.useMemo(() => {\\n    const userName = user?.fullName || user?.emailAddresses[0]?.emailAddress || 'Unknown';\\n    const initials = userName\\n      .split(' ')\\n      .map((name) => name[0])\\n      .join('');\\n\\n    const imageSource = user?.imageUrl ? { uri: user.imageUrl } : undefined;\\n    return { initials, imageSource, userName };\\n  }, [user?.imageUrl, user?.fullName, user?.emailAddresses[0]?.emailAddress]);\\n\\n  return (\\n    <Avatar alt={`${userName}'s avatar`} {...props}>\\n      <AvatarImage source={imageSource} />\\n      <AvatarFallback>\\n        <Text>{initials}</Text>\\n      </AvatarFallback>\\n    </Avatar>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/user-menu.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"user-menu\",\n  \"type\": \"registry:component\",\n  \"title\": \"User Menu\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A popover menu presenting options and actions for the current user.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/avatar.json\",\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/icon.json\",\n    \"https://reactnativereusables.com/r/uniwind/popover.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/user-menu.tsx\",\n      \"content\": \"import { Avatar, AvatarFallback, AvatarImage } from '@/registry/nativewind/components/ui/avatar';\\nimport { Button } from '@/registry/nativewind/components/ui/button';\\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\\nimport {\\n  Popover,\\n  PopoverContent,\\n  PopoverTrigger,\\n} from '@/registry/nativewind/components/ui/popover';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { cn } from '@/registry/nativewind/lib/utils';\\nimport type { TriggerRef } from '@rn-primitives/popover';\\nimport { LogOutIcon, PlusIcon, SettingsIcon } from 'lucide-react-native';\\nimport * as React from 'react';\\nimport { View } from 'react-native';\\n\\nconst USER = {\\n  fullName: 'Zach Nugent',\\n  initials: 'ZN',\\n  imgSrc: { uri: 'https://github.com/mrzachnugent.png' },\\n  username: 'mrzachnugent',\\n};\\n\\nexport function UserMenu() {\\n  const popoverTriggerRef = React.useRef<TriggerRef>(null);\\n\\n  async function onSignOut() {\\n    popoverTriggerRef.current?.close();\\n    // TODO: Sign out and navigate to sign in screen\\n  }\\n\\n  return (\\n    <Popover>\\n      <PopoverTrigger asChild ref={popoverTriggerRef}>\\n        <Button variant=\\\"ghost\\\" size=\\\"icon\\\" className=\\\"size-8 rounded-full\\\">\\n          <UserAvatar />\\n        </Button>\\n      </PopoverTrigger>\\n      <PopoverContent align=\\\"center\\\" side=\\\"bottom\\\" className=\\\"w-80 p-0\\\">\\n        <View className=\\\"border-border gap-3 border-b p-3\\\">\\n          <View className=\\\"flex-row items-center gap-3\\\">\\n            <UserAvatar className=\\\"size-10\\\" />\\n            <View className=\\\"flex-1\\\">\\n              <Text className=\\\"font-medium leading-5\\\">{USER.fullName}</Text>\\n              {USER.fullName?.length ? (\\n                <Text className=\\\"text-muted-foreground text-sm font-normal leading-4\\\">\\n                  {USER.username}\\n                </Text>\\n              ) : null}\\n            </View>\\n          </View>\\n          <View className=\\\"flex-row flex-wrap gap-3 py-0.5\\\">\\n            <Button\\n              variant=\\\"outline\\\"\\n              size=\\\"sm\\\"\\n              onPress={() => {\\n                // TODO: Navigate to account settings screen\\n              }}>\\n              <Icon as={SettingsIcon} className=\\\"size-4\\\" />\\n              <Text>Manage Account</Text>\\n            </Button>\\n            <Button variant=\\\"outline\\\" size=\\\"sm\\\" className=\\\"flex-1\\\" onPress={onSignOut}>\\n              <Icon as={LogOutIcon} className=\\\"size-4\\\" />\\n              <Text>Sign Out</Text>\\n            </Button>\\n          </View>\\n        </View>\\n        <Button\\n          variant=\\\"ghost\\\"\\n          size=\\\"lg\\\"\\n          className=\\\"h-16 justify-start gap-3 rounded-none rounded-b-md px-3 sm:h-14\\\"\\n          onPress={() => {\\n            // TODO: Navigate to add account screen\\n          }}>\\n          <View className=\\\"size-10 items-center justify-center\\\">\\n            <View className=\\\"border-border bg-muted/50 size-7 items-center justify-center rounded-full border border-dashed\\\">\\n              <Icon as={PlusIcon} className=\\\"size-5\\\" />\\n            </View>\\n          </View>\\n          <Text>Add account</Text>\\n        </Button>\\n      </PopoverContent>\\n    </Popover>\\n  );\\n}\\n\\nfunction UserAvatar({ className, ...props }: Omit<React.ComponentProps<typeof Avatar>, 'alt'>) {\\n  return (\\n    <Avatar alt={`${USER.fullName}'s avatar`} className={cn('size-8', className)} {...props}>\\n      <AvatarImage source={USER.imgSrc} />\\n      <AvatarFallback>\\n        <Text>{USER.initials}</Text>\\n      </AvatarFallback>\\n    </Avatar>\\n  );\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/verify-email-form-clerk.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"verify-email-form-clerk\",\n  \"type\": \"registry:component\",\n  \"title\": \"Verify Email Form (Clerk)\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for verifying an email address with an OTP sent via email with Clerk integration.\",\n  \"dependencies\": [\n    \"@clerk/clerk-expo\"\n  ],\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/card.json\",\n    \"https://reactnativereusables.com/r/uniwind/input.json\",\n    \"https://reactnativereusables.com/r/uniwind/label.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/verify-email-form.tsx\",\n      \"content\": \"import { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport { useSignUp } from '@clerk/clerk-expo';\\nimport * as React from 'react';\\nimport { type TextStyle, View } from 'react-native';\\n\\nconst RESEND_CODE_INTERVAL_SECONDS = 30;\\n\\nconst TABULAR_NUMBERS_STYLE: TextStyle = { fontVariant: ['tabular-nums'] };\\n\\nexport function VerifyEmailForm() {\\n  const { signUp, setActive, isLoaded } = useSignUp();\\n  const [code, setCode] = React.useState('');\\n  const [error, setError] = React.useState('');\\n  const { countdown, restartCountdown } = useCountdown(RESEND_CODE_INTERVAL_SECONDS);\\n\\n  async function onSubmit() {\\n    if (!isLoaded) return;\\n\\n    try {\\n      // Use the code the user provided to attempt verification\\n      const signUpAttempt = await signUp.attemptEmailAddressVerification({\\n        code,\\n      });\\n\\n      // If verification was completed, set the session to active\\n      // and redirect the user\\n      if (signUpAttempt.status === 'complete') {\\n        await setActive({ session: signUpAttempt.createdSessionId });\\n        // TODO: Redirect authenticated users to your protected screen\\n        return;\\n      }\\n      // TODO: Handle other statuses\\n      // If the status is not complete, check why. User may need to\\n      // complete further steps.\\n      console.error(JSON.stringify(signUpAttempt, null, 2));\\n    } catch (err) {\\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\\n      if (err instanceof Error) {\\n        setError(err.message);\\n        return;\\n      }\\n      console.error(JSON.stringify(err, null, 2));\\n    }\\n  }\\n\\n  async function onResendCode() {\\n    if (!isLoaded) return;\\n\\n    try {\\n      await signUp.prepareEmailAddressVerification({ strategy: 'email_code' });\\n      restartCountdown();\\n    } catch (err) {\\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\\n      if (err instanceof Error) {\\n        setError(err.message);\\n        return;\\n      }\\n      console.error(JSON.stringify(err, null, 2));\\n    }\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Verify your email</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Enter the verification code sent to m@example.com\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"code\\\">Verification code</Label>\\n              <Input\\n                id=\\\"code\\\"\\n                autoCapitalize=\\\"none\\\"\\n                onChangeText={setCode}\\n                returnKeyType=\\\"send\\\"\\n                keyboardType=\\\"numeric\\\"\\n                autoComplete=\\\"sms-otp\\\"\\n                textContentType=\\\"oneTimeCode\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n              {!error ? null : (\\n                <Text className=\\\"text-destructive text-sm font-medium\\\">{error}</Text>\\n              )}\\n              <Button variant=\\\"link\\\" size=\\\"sm\\\" disabled={countdown > 0} onPress={onResendCode}>\\n                <Text className=\\\"text-center text-xs\\\">\\n                  Didn&apos;t receive the code? Resend{' '}\\n                  {countdown > 0 ? (\\n                    <Text className=\\\"text-xs\\\" style={TABULAR_NUMBERS_STYLE}>\\n                      ({countdown})\\n                    </Text>\\n                  ) : null}\\n                </Text>\\n              </Button>\\n            </View>\\n            <View className=\\\"gap-3\\\">\\n              <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n                <Text>Continue</Text>\\n              </Button>\\n              <Button\\n                variant=\\\"link\\\"\\n                className=\\\"mx-auto\\\"\\n                onPress={() => {\\n                  // TODO: Navigate to sign up screen\\n                }}>\\n                <Text>Cancel</Text>\\n              </Button>\\n            </View>\\n          </View>\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\\nfunction useCountdown(seconds = 30) {\\n  const [countdown, setCountdown] = React.useState(seconds);\\n  const intervalRef = React.useRef<ReturnType<typeof setInterval> | null>(null);\\n\\n  const startCountdown = React.useCallback(() => {\\n    setCountdown(seconds);\\n\\n    if (intervalRef.current) {\\n      clearInterval(intervalRef.current);\\n    }\\n\\n    intervalRef.current = setInterval(() => {\\n      setCountdown((prev) => {\\n        if (prev <= 1) {\\n          if (intervalRef.current) {\\n            clearInterval(intervalRef.current);\\n            intervalRef.current = null;\\n          }\\n          return 0;\\n        }\\n        return prev - 1;\\n      });\\n    }, 1000);\\n  }, [seconds]);\\n\\n  React.useEffect(() => {\\n    startCountdown();\\n\\n    return () => {\\n      if (intervalRef.current) {\\n        clearInterval(intervalRef.current);\\n      }\\n    };\\n  }, [startCountdown]);\\n\\n  return { countdown, restartCountdown: startCountdown };\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/public/r/uniwind/verify-email-form.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry-item.json\",\n  \"name\": \"verify-email-form\",\n  \"type\": \"registry:component\",\n  \"title\": \"Verify Email Form\",\n  \"author\": \"@mrzachnugent\",\n  \"description\": \"A form for verifying an email address with an OTP sent via email.\",\n  \"registryDependencies\": [\n    \"https://reactnativereusables.com/r/uniwind/button.json\",\n    \"https://reactnativereusables.com/r/uniwind/card.json\",\n    \"https://reactnativereusables.com/r/uniwind/input.json\",\n    \"https://reactnativereusables.com/r/uniwind/label.json\",\n    \"https://reactnativereusables.com/r/uniwind/text.json\"\n  ],\n  \"files\": [\n    {\n      \"path\": \"./node_modules/@rnr/registry/src/blocks/verify-email-form.tsx\",\n      \"content\": \"import { Button } from '@/registry/nativewind/components/ui/button';\\nimport {\\n  Card,\\n  CardContent,\\n  CardDescription,\\n  CardHeader,\\n  CardTitle,\\n} from '@/registry/nativewind/components/ui/card';\\nimport { Input } from '@/registry/nativewind/components/ui/input';\\nimport { Label } from '@/registry/nativewind/components/ui/label';\\nimport { Text } from '@/registry/nativewind/components/ui/text';\\nimport * as React from 'react';\\nimport { type TextStyle, View } from 'react-native';\\n\\nconst RESEND_CODE_INTERVAL_SECONDS = 30;\\n\\nconst TABULAR_NUMBERS_STYLE: TextStyle = { fontVariant: ['tabular-nums'] };\\n\\nexport function VerifyEmailForm() {\\n  const { countdown, restartCountdown } = useCountdown(RESEND_CODE_INTERVAL_SECONDS);\\n\\n  function onSubmit() {\\n    // TODO: Submit form and navigate to protected screen if successful\\n  }\\n\\n  return (\\n    <View className=\\\"gap-6\\\">\\n      <Card className=\\\"border-border/0 sm:border-border pb-4 shadow-none sm:shadow-sm sm:shadow-black/5\\\">\\n        <CardHeader>\\n          <CardTitle className=\\\"text-center text-xl sm:text-left\\\">Verify your email</CardTitle>\\n          <CardDescription className=\\\"text-center sm:text-left\\\">\\n            Enter the verification code sent to m@example.com\\n          </CardDescription>\\n        </CardHeader>\\n        <CardContent className=\\\"gap-6\\\">\\n          <View className=\\\"gap-6\\\">\\n            <View className=\\\"gap-1.5\\\">\\n              <Label htmlFor=\\\"code\\\">Verification code</Label>\\n              <Input\\n                id=\\\"code\\\"\\n                autoCapitalize=\\\"none\\\"\\n                returnKeyType=\\\"send\\\"\\n                keyboardType=\\\"numeric\\\"\\n                autoComplete=\\\"sms-otp\\\"\\n                textContentType=\\\"oneTimeCode\\\"\\n                onSubmitEditing={onSubmit}\\n              />\\n              <Button\\n                variant=\\\"link\\\"\\n                size=\\\"sm\\\"\\n                disabled={countdown > 0}\\n                onPress={() => {\\n                  // TODO: Resend code\\n                  restartCountdown();\\n                }}>\\n                <Text className=\\\"text-center text-xs\\\">\\n                  Didn&apos;t receive the code? Resend{' '}\\n                  {countdown > 0 ? (\\n                    <Text className=\\\"text-xs\\\" style={TABULAR_NUMBERS_STYLE}>\\n                      ({countdown})\\n                    </Text>\\n                  ) : null}\\n                </Text>\\n              </Button>\\n            </View>\\n            <View className=\\\"gap-3\\\">\\n              <Button className=\\\"w-full\\\" onPress={onSubmit}>\\n                <Text>Continue</Text>\\n              </Button>\\n              <Button\\n                variant=\\\"link\\\"\\n                className=\\\"mx-auto\\\"\\n                onPress={() => {\\n                  // TODO: Navigate to sign up screen\\n                }}>\\n                <Text>Cancel</Text>\\n              </Button>\\n            </View>\\n          </View>\\n        </CardContent>\\n      </Card>\\n    </View>\\n  );\\n}\\n\\nfunction useCountdown(seconds = 30) {\\n  const [countdown, setCountdown] = React.useState(seconds);\\n  const intervalRef = React.useRef<ReturnType<typeof setInterval> | null>(null);\\n\\n  const startCountdown = React.useCallback(() => {\\n    setCountdown(seconds);\\n\\n    if (intervalRef.current) {\\n      clearInterval(intervalRef.current);\\n    }\\n\\n    intervalRef.current = setInterval(() => {\\n      setCountdown((prev) => {\\n        if (prev <= 1) {\\n          if (intervalRef.current) {\\n            clearInterval(intervalRef.current);\\n            intervalRef.current = null;\\n          }\\n          return 0;\\n        }\\n        return prev - 1;\\n      });\\n    }, 1000);\\n  }, [seconds]);\\n\\n  React.useEffect(() => {\\n    startCountdown();\\n\\n    return () => {\\n      if (intervalRef.current) {\\n        clearInterval(intervalRef.current);\\n      }\\n    };\\n  }, [startCountdown]);\\n\\n  return { countdown, restartCountdown: startCountdown };\\n}\\n\",\n      \"type\": \"registry:component\"\n    }\n  ]\n}"
  },
  {
    "path": "apps/docs/registry/nativewind.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry.json\",\n  \"name\": \"React Native Reusables\",\n  \"homepage\": \"https://reactnativereusables.com/\",\n  \"items\": [\n    {\n      \"name\": \"accordion\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Accordion\",\n      \"description\": \"A vertically stacked set of interactive headings that each reveal a section of content.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/accordion.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/text.json\",\n        \"https://reactnativereusables.com/r/nativewind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/accordion\"]\n    },\n    {\n      \"name\": \"alert\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Alert\",\n      \"description\": \"Displays a callout for user attention.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/alert.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/text.json\",\n        \"https://reactnativereusables.com/r/nativewind/icon.json\"\n      ]\n    },\n    {\n      \"name\": \"alert-dialog\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Alert Dialog\",\n      \"description\": \"A modal dialog that interrupts the user with important content and expects a response.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/alert-dialog.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/alert-dialog\"]\n    },\n    {\n      \"name\": \"aspect-ratio\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Aspect Ratio\",\n      \"description\": \"Displays content within a desired ratio.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/aspect-ratio.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/aspect-ratio\"]\n    },\n    {\n      \"name\": \"avatar\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Avatar\",\n      \"description\": \"An image element with a fallback for representing the user.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/avatar.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/avatar\"]\n    },\n    {\n      \"name\": \"badge\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Badge\",\n      \"description\": \"Displays a badge or a component that looks like a badge.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/badge.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/nativewind/text.json\"],\n      \"dependencies\": [\"@rn-primitives/slot\"]\n    },\n    {\n      \"name\": \"button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Button\",\n      \"description\": \"Displays a button or a component that looks like a button.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/nativewind/text.json\"]\n    },\n    {\n      \"name\": \"card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Card\",\n      \"description\": \"Displays a card with header, content, and footer.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/nativewind/text.json\"]\n    },\n    {\n      \"name\": \"checkbox\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Checkbox\",\n      \"description\": \"A control that allows the user to toggle between checked and not checked.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/checkbox.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/nativewind/icon.json\"],\n      \"dependencies\": [\"@rn-primitives/checkbox\"]\n    },\n    {\n      \"name\": \"collapsible\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Collapsible\",\n      \"description\": \"A control that allows the user to toggle between checked and not checked.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/collapsible.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/collapsible\"]\n    },\n    {\n      \"name\": \"context-menu\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Context Menu\",\n      \"description\": \"Displays a menu to the user — such as a set of actions or functions — triggered by a button.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/context-menu.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/text.json\",\n        \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\",\n        \"https://reactnativereusables.com/r/nativewind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/context-menu\"]\n    },\n    {\n      \"name\": \"dialog\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dialog\",\n      \"description\": \"A window overlaid on either the primary window or another dialog window, rendering the content underneath inert.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/dialog.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/text.json\",\n        \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\",\n        \"https://reactnativereusables.com/r/nativewind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/dialog\"]\n    },\n    {\n      \"name\": \"dropdown-menu\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dropdown Menu\",\n      \"description\": \"Displays a menu to the user — such as a set of actions or functions — triggered by a button.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/dropdown-menu.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/text.json\",\n        \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\",\n        \"https://reactnativereusables.com/r/nativewind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/dropdown-menu\"]\n    },\n    {\n      \"name\": \"hover-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Hover Card\",\n      \"description\": \"For sighted users to preview content available behind a link.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/hover-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/text.json\",\n        \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/hover-card\"]\n    },\n    {\n      \"name\": \"icon\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Icon\",\n      \"description\": \"A component for displaying icons with consistent styling.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/icon.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"input\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Input\",\n      \"description\": \"Displays a form input field or a component that looks like an input field.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/input.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"label\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Label\",\n      \"description\": \"Renders an accessible label associated with controls.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/label.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/label\"]\n    },\n    {\n      \"name\": \"menubar\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Menubar\",\n      \"description\": \"A visually persistent menu common in desktop applications that provides quick access to a consistent set of commands.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/menubar.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/text.json\",\n        \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\",\n        \"https://reactnativereusables.com/r/nativewind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/menubar\"]\n    },\n    {\n      \"name\": \"native-only-animated-view\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Native Only Animated View\",\n      \"description\": \"A component that is only rendered and animated on native platforms.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/native-only-animated-view.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"popover\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Popover\",\n      \"description\": \"Displays rich content in a portal, triggered by a button.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/popover.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/text.json\",\n        \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/popover\"]\n    },\n    {\n      \"name\": \"progress\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Progress\",\n      \"description\": \"Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/progress.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/progress\"]\n    },\n    {\n      \"name\": \"radio-group\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Radio Group\",\n      \"description\": \"A set of checkable buttons—known as radio buttons—where no more than one of the buttons can be checked at a time.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/radio-group.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/radio-group\"]\n    },\n    {\n      \"name\": \"select\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Select\",\n      \"description\": \"Displays a list of options for the user to pick from—triggered by a button.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/select.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/text.json\",\n        \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\",\n        \"https://reactnativereusables.com/r/nativewind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/select\"]\n    },\n    {\n      \"name\": \"separator\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Separator\",\n      \"description\": \"Visually or semantically separates content.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/separator.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/separator\"]\n    },\n    {\n      \"name\": \"skeleton\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Skeleton\",\n      \"description\": \"Use to show a placeholder while content is loading.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/skeleton.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"switch\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Switch\",\n      \"description\": \"A control that allows the user to toggle between checked and not checked.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/switch.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/switch\"]\n    },\n    {\n      \"name\": \"tabs\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Tabs\",\n      \"description\": \"A set of layered sections of content—known as tab panels—that are displayed one at a time.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/tabs.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/nativewind/text.json\"],\n      \"dependencies\": [\"@rn-primitives/tabs\"]\n    },\n    {\n      \"name\": \"text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Text\",\n      \"description\": \"A component for displaying text.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/slot\"]\n    },\n    {\n      \"name\": \"textarea\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Textarea\",\n      \"description\": \"Displays a form textarea or a component that looks like a textarea.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/textarea.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"toggle\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Toggle\",\n      \"description\": \"A two-state button that can be either on or off.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/toggle.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/text.json\",\n        \"https://reactnativereusables.com/r/nativewind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/toggle\"]\n    },\n    {\n      \"name\": \"toggle-group\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Toggle Group\",\n      \"description\": \"A set of two-state buttons that can be toggled on or off.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/toggle-group.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/text.json\",\n        \"https://reactnativereusables.com/r/nativewind/icon.json\",\n        \"https://reactnativereusables.com/r/nativewind/toggle.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/toggle-group\"]\n    },\n    {\n      \"name\": \"tooltip\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Tooltip\",\n      \"description\": \"A popup that displays information related to an element when the element receives keyboard focus, the mouse hovers over it, or when it is pressed.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/nativewind/components/ui/tooltip.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/text.json\",\n        \"https://reactnativereusables.com/r/nativewind/native-only-animated-view.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/tooltip\"]\n    },\n    {\n      \"name\": \"sign-in-form\",\n      \"type\": \"registry:component\",\n      \"title\": \"Sign In Form\",\n      \"description\": \"A form for signing in using email and password or social providers.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/sign-in-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/card.json\",\n        \"https://reactnativereusables.com/r/nativewind/input.json\",\n        \"https://reactnativereusables.com/r/nativewind/label.json\",\n        \"https://reactnativereusables.com/r/nativewind/separator.json\",\n        \"https://reactnativereusables.com/r/nativewind/social-connections.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"sign-up-form\",\n      \"type\": \"registry:component\",\n      \"title\": \"Sign Up Form\",\n      \"description\": \"A form for creating an account with email and password or social providers.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/sign-up-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/card.json\",\n        \"https://reactnativereusables.com/r/nativewind/input.json\",\n        \"https://reactnativereusables.com/r/nativewind/label.json\",\n        \"https://reactnativereusables.com/r/nativewind/separator.json\",\n        \"https://reactnativereusables.com/r/nativewind/social-connections.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"forgot-password-form\",\n      \"type\": \"registry:component\",\n      \"title\": \"Forgot Password Form\",\n      \"description\": \"A form that sends a password reset OTP to the user's email address.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/forgot-password-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/card.json\",\n        \"https://reactnativereusables.com/r/nativewind/input.json\",\n        \"https://reactnativereusables.com/r/nativewind/label.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"reset-password-form\",\n      \"type\": \"registry:component\",\n      \"title\": \"Reset Password Form\",\n      \"description\": \"A form for resetting a password with an OTP sent via email.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/reset-password-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/card.json\",\n        \"https://reactnativereusables.com/r/nativewind/input.json\",\n        \"https://reactnativereusables.com/r/nativewind/label.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"verify-email-form\",\n      \"type\": \"registry:component\",\n      \"title\": \"Verify Email Form\",\n      \"description\": \"A form for verifying an email address with an OTP sent via email.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/verify-email-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/card.json\",\n        \"https://reactnativereusables.com/r/nativewind/input.json\",\n        \"https://reactnativereusables.com/r/nativewind/label.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"user-menu\",\n      \"type\": \"registry:component\",\n      \"title\": \"User Menu\",\n      \"description\": \"A popover menu presenting options and actions for the current user.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/user-menu.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/avatar.json\",\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/icon.json\",\n        \"https://reactnativereusables.com/r/nativewind/popover.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"social-connections\",\n      \"type\": \"registry:component\",\n      \"title\": \"Social Connections\",\n      \"description\": \"A set of buttons for authenticating through social providers.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/social-connections.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/nativewind/button.json\"]\n    },\n    {\n      \"name\": \"sign-in-form-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"Sign In Form (Clerk)\",\n      \"description\": \"A form for signing in using email and password or social providers with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/sign-in-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\"],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/card.json\",\n        \"https://reactnativereusables.com/r/nativewind/input.json\",\n        \"https://reactnativereusables.com/r/nativewind/label.json\",\n        \"https://reactnativereusables.com/r/nativewind/separator.json\",\n        \"https://reactnativereusables.com/r/nativewind/social-connections-clerk.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"sign-up-form-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"Sign Up Form (Clerk)\",\n      \"description\": \"A form for creating an account with email and password or social providers with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/sign-up-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\"],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/card.json\",\n        \"https://reactnativereusables.com/r/nativewind/input.json\",\n        \"https://reactnativereusables.com/r/nativewind/label.json\",\n        \"https://reactnativereusables.com/r/nativewind/separator.json\",\n        \"https://reactnativereusables.com/r/nativewind/social-connections-clerk.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"forgot-password-form-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"Forgot Password Form (Clerk)\",\n      \"description\": \"A form that sends a password reset OTP to the user's email address with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/forgot-password-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\"],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/card.json\",\n        \"https://reactnativereusables.com/r/nativewind/input.json\",\n        \"https://reactnativereusables.com/r/nativewind/label.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"reset-password-form-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"Reset Password Form (Clerk)\",\n      \"description\": \"A form for resetting a password with an OTP sent via email with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/reset-password-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\"],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/card.json\",\n        \"https://reactnativereusables.com/r/nativewind/input.json\",\n        \"https://reactnativereusables.com/r/nativewind/label.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"verify-email-form-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"Verify Email Form (Clerk)\",\n      \"description\": \"A form for verifying an email address with an OTP sent via email with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/verify-email-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\"],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/card.json\",\n        \"https://reactnativereusables.com/r/nativewind/input.json\",\n        \"https://reactnativereusables.com/r/nativewind/label.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"user-menu-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"User Menu (Clerk)\",\n      \"description\": \"A popover menu presenting options and actions for the current user with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/user-menu.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\"],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/nativewind/avatar.json\",\n        \"https://reactnativereusables.com/r/nativewind/button.json\",\n        \"https://reactnativereusables.com/r/nativewind/icon.json\",\n        \"https://reactnativereusables.com/r/nativewind/popover.json\",\n        \"https://reactnativereusables.com/r/nativewind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"social-connections-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"Social Connections (Clerk)\",\n      \"description\": \"A set of buttons for authenticating through social providers with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/social-connections.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\", \"expo-auth-session\", \"expo-web-browser\"],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/nativewind/button.json\"]\n    }\n  ]\n}\n"
  },
  {
    "path": "apps/docs/registry/uniwind.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema/registry.json\",\n  \"name\": \"React Native Reusables\",\n  \"homepage\": \"https://reactnativereusables.com/\",\n  \"items\": [\n    {\n      \"name\": \"accordion\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Accordion\",\n      \"description\": \"A vertically stacked set of interactive headings that each reveal a section of content.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/accordion.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/text.json\",\n        \"https://reactnativereusables.com/r/uniwind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/accordion\"]\n    },\n    {\n      \"name\": \"alert\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Alert\",\n      \"description\": \"Displays a callout for user attention.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/alert.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/text.json\",\n        \"https://reactnativereusables.com/r/uniwind/icon.json\"\n      ]\n    },\n    {\n      \"name\": \"alert-dialog\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Alert Dialog\",\n      \"description\": \"A modal dialog that interrupts the user with important content and expects a response.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/alert-dialog.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/alert-dialog\"]\n    },\n    {\n      \"name\": \"aspect-ratio\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Aspect Ratio\",\n      \"description\": \"Displays content within a desired ratio.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/aspect-ratio.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/aspect-ratio\"]\n    },\n    {\n      \"name\": \"avatar\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Avatar\",\n      \"description\": \"An image element with a fallback for representing the user.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/avatar.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/avatar\"]\n    },\n    {\n      \"name\": \"badge\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Badge\",\n      \"description\": \"Displays a badge or a component that looks like a badge.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/badge.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/uniwind/text.json\"],\n      \"dependencies\": [\"@rn-primitives/slot\"]\n    },\n    {\n      \"name\": \"button\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Button\",\n      \"description\": \"Displays a button or a component that looks like a button.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/button.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/uniwind/text.json\"]\n    },\n    {\n      \"name\": \"card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Card\",\n      \"description\": \"Displays a card with header, content, and footer.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/uniwind/text.json\"]\n    },\n    {\n      \"name\": \"checkbox\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Checkbox\",\n      \"description\": \"A control that allows the user to toggle between checked and not checked.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/checkbox.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/uniwind/icon.json\"],\n      \"dependencies\": [\"@rn-primitives/checkbox\"]\n    },\n    {\n      \"name\": \"collapsible\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Collapsible\",\n      \"description\": \"A control that allows the user to toggle between checked and not checked.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/collapsible.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/collapsible\"]\n    },\n    {\n      \"name\": \"context-menu\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Context Menu\",\n      \"description\": \"Displays a menu to the user — such as a set of actions or functions — triggered by a button.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/context-menu.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/text.json\",\n        \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\",\n        \"https://reactnativereusables.com/r/uniwind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/context-menu\"]\n    },\n    {\n      \"name\": \"dialog\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dialog\",\n      \"description\": \"A window overlaid on either the primary window or another dialog window, rendering the content underneath inert.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/dialog.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/text.json\",\n        \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\",\n        \"https://reactnativereusables.com/r/uniwind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/dialog\"]\n    },\n    {\n      \"name\": \"dropdown-menu\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Dropdown Menu\",\n      \"description\": \"Displays a menu to the user — such as a set of actions or functions — triggered by a button.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/dropdown-menu.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/text.json\",\n        \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\",\n        \"https://reactnativereusables.com/r/uniwind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/dropdown-menu\"]\n    },\n    {\n      \"name\": \"hover-card\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Hover Card\",\n      \"description\": \"For sighted users to preview content available behind a link.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/hover-card.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/text.json\",\n        \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/hover-card\"]\n    },\n    {\n      \"name\": \"icon\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Icon\",\n      \"description\": \"A component for displaying icons with consistent styling.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/icon.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"input\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Input\",\n      \"description\": \"Displays a form input field or a component that looks like an input field.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/input.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"label\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Label\",\n      \"description\": \"Renders an accessible label associated with controls.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/label.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/label\"]\n    },\n    {\n      \"name\": \"menubar\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Menubar\",\n      \"description\": \"A visually persistent menu common in desktop applications that provides quick access to a consistent set of commands.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/menubar.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/text.json\",\n        \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\",\n        \"https://reactnativereusables.com/r/uniwind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/menubar\"]\n    },\n    {\n      \"name\": \"native-only-animated-view\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Native Only Animated View\",\n      \"description\": \"A component that is only rendered and animated on native platforms.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/native-only-animated-view.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"popover\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Popover\",\n      \"description\": \"Displays rich content in a portal, triggered by a button.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/popover.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/text.json\",\n        \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/popover\"]\n    },\n    {\n      \"name\": \"progress\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Progress\",\n      \"description\": \"Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/progress.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/progress\"]\n    },\n    {\n      \"name\": \"radio-group\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Radio Group\",\n      \"description\": \"A set of checkable buttons—known as radio buttons—where no more than one of the buttons can be checked at a time.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/radio-group.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/radio-group\"]\n    },\n    {\n      \"name\": \"select\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Select\",\n      \"description\": \"Displays a list of options for the user to pick from—triggered by a button.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/select.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/text.json\",\n        \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\",\n        \"https://reactnativereusables.com/r/uniwind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/select\"]\n    },\n    {\n      \"name\": \"separator\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Separator\",\n      \"description\": \"Visually or semantically separates content.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/separator.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/separator\"]\n    },\n    {\n      \"name\": \"skeleton\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Skeleton\",\n      \"description\": \"Use to show a placeholder while content is loading.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/skeleton.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"switch\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Switch\",\n      \"description\": \"A control that allows the user to toggle between checked and not checked.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/switch.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/switch\"]\n    },\n    {\n      \"name\": \"tabs\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Tabs\",\n      \"description\": \"A set of layered sections of content—known as tab panels—that are displayed one at a time.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/tabs.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/uniwind/text.json\"],\n      \"dependencies\": [\"@rn-primitives/tabs\"]\n    },\n    {\n      \"name\": \"text\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Text\",\n      \"description\": \"A component for displaying text.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/text.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"dependencies\": [\"@rn-primitives/slot\"]\n    },\n    {\n      \"name\": \"textarea\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Textarea\",\n      \"description\": \"Displays a form textarea or a component that looks like a textarea.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/textarea.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ]\n    },\n    {\n      \"name\": \"toggle\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Toggle\",\n      \"description\": \"A two-state button that can be either on or off.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/toggle.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/text.json\",\n        \"https://reactnativereusables.com/r/uniwind/icon.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/toggle\"]\n    },\n    {\n      \"name\": \"toggle-group\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Toggle Group\",\n      \"description\": \"A set of two-state buttons that can be toggled on or off.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/toggle-group.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/text.json\",\n        \"https://reactnativereusables.com/r/uniwind/icon.json\",\n        \"https://reactnativereusables.com/r/uniwind/toggle.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/toggle-group\"]\n    },\n    {\n      \"name\": \"tooltip\",\n      \"type\": \"registry:ui\",\n      \"title\": \"Tooltip\",\n      \"description\": \"A popup that displays information related to an element when the element receives keyboard focus, the mouse hovers over it, or when it is pressed.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/uniwind/components/ui/tooltip.tsx\",\n          \"type\": \"registry:ui\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/text.json\",\n        \"https://reactnativereusables.com/r/uniwind/native-only-animated-view.json\"\n      ],\n      \"dependencies\": [\"@rn-primitives/tooltip\"]\n    },\n    {\n      \"name\": \"sign-in-form\",\n      \"type\": \"registry:component\",\n      \"title\": \"Sign In Form\",\n      \"description\": \"A form for signing in using email and password or social providers.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/sign-in-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/card.json\",\n        \"https://reactnativereusables.com/r/uniwind/input.json\",\n        \"https://reactnativereusables.com/r/uniwind/label.json\",\n        \"https://reactnativereusables.com/r/uniwind/separator.json\",\n        \"https://reactnativereusables.com/r/uniwind/social-connections.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"sign-up-form\",\n      \"type\": \"registry:component\",\n      \"title\": \"Sign Up Form\",\n      \"description\": \"A form for creating an account with email and password or social providers.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/sign-up-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/card.json\",\n        \"https://reactnativereusables.com/r/uniwind/input.json\",\n        \"https://reactnativereusables.com/r/uniwind/label.json\",\n        \"https://reactnativereusables.com/r/uniwind/separator.json\",\n        \"https://reactnativereusables.com/r/uniwind/social-connections.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"forgot-password-form\",\n      \"type\": \"registry:component\",\n      \"title\": \"Forgot Password Form\",\n      \"description\": \"A form that sends a password reset OTP to the user's email address.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/forgot-password-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/card.json\",\n        \"https://reactnativereusables.com/r/uniwind/input.json\",\n        \"https://reactnativereusables.com/r/uniwind/label.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"reset-password-form\",\n      \"type\": \"registry:component\",\n      \"title\": \"Reset Password Form\",\n      \"description\": \"A form for resetting a password with an OTP sent via email.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/reset-password-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/card.json\",\n        \"https://reactnativereusables.com/r/uniwind/input.json\",\n        \"https://reactnativereusables.com/r/uniwind/label.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"verify-email-form\",\n      \"type\": \"registry:component\",\n      \"title\": \"Verify Email Form\",\n      \"description\": \"A form for verifying an email address with an OTP sent via email.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/verify-email-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/card.json\",\n        \"https://reactnativereusables.com/r/uniwind/input.json\",\n        \"https://reactnativereusables.com/r/uniwind/label.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"user-menu\",\n      \"type\": \"registry:component\",\n      \"title\": \"User Menu\",\n      \"description\": \"A popover menu presenting options and actions for the current user.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/user-menu.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/avatar.json\",\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/icon.json\",\n        \"https://reactnativereusables.com/r/uniwind/popover.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"social-connections\",\n      \"type\": \"registry:component\",\n      \"title\": \"Social Connections\",\n      \"description\": \"A set of buttons for authenticating through social providers.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/social-connections.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/uniwind/button.json\"]\n    },\n    {\n      \"name\": \"sign-in-form-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"Sign In Form (Clerk)\",\n      \"description\": \"A form for signing in using email and password or social providers with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/sign-in-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\"],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/card.json\",\n        \"https://reactnativereusables.com/r/uniwind/input.json\",\n        \"https://reactnativereusables.com/r/uniwind/label.json\",\n        \"https://reactnativereusables.com/r/uniwind/separator.json\",\n        \"https://reactnativereusables.com/r/uniwind/social-connections-clerk.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"sign-up-form-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"Sign Up Form (Clerk)\",\n      \"description\": \"A form for creating an account with email and password or social providers with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/sign-up-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\"],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/card.json\",\n        \"https://reactnativereusables.com/r/uniwind/input.json\",\n        \"https://reactnativereusables.com/r/uniwind/label.json\",\n        \"https://reactnativereusables.com/r/uniwind/separator.json\",\n        \"https://reactnativereusables.com/r/uniwind/social-connections-clerk.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"forgot-password-form-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"Forgot Password Form (Clerk)\",\n      \"description\": \"A form that sends a password reset OTP to the user's email address with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/forgot-password-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\"],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/card.json\",\n        \"https://reactnativereusables.com/r/uniwind/input.json\",\n        \"https://reactnativereusables.com/r/uniwind/label.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"reset-password-form-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"Reset Password Form (Clerk)\",\n      \"description\": \"A form for resetting a password with an OTP sent via email with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/reset-password-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\"],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/card.json\",\n        \"https://reactnativereusables.com/r/uniwind/input.json\",\n        \"https://reactnativereusables.com/r/uniwind/label.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"verify-email-form-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"Verify Email Form (Clerk)\",\n      \"description\": \"A form for verifying an email address with an OTP sent via email with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/verify-email-form.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\"],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/card.json\",\n        \"https://reactnativereusables.com/r/uniwind/input.json\",\n        \"https://reactnativereusables.com/r/uniwind/label.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"user-menu-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"User Menu (Clerk)\",\n      \"description\": \"A popover menu presenting options and actions for the current user with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/user-menu.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\"],\n      \"registryDependencies\": [\n        \"https://reactnativereusables.com/r/uniwind/avatar.json\",\n        \"https://reactnativereusables.com/r/uniwind/button.json\",\n        \"https://reactnativereusables.com/r/uniwind/icon.json\",\n        \"https://reactnativereusables.com/r/uniwind/popover.json\",\n        \"https://reactnativereusables.com/r/uniwind/text.json\"\n      ]\n    },\n    {\n      \"name\": \"social-connections-clerk\",\n      \"type\": \"registry:component\",\n      \"title\": \"Social Connections (Clerk)\",\n      \"description\": \"A set of buttons for authenticating through social providers with Clerk integration.\",\n      \"author\": \"@mrzachnugent\",\n      \"files\": [\n        {\n          \"path\": \"./node_modules/@rnr/registry/src/blocks/clerk/social-connections.tsx\",\n          \"type\": \"registry:component\"\n        }\n      ],\n      \"dependencies\": [\"@clerk/clerk-expo\", \"expo-auth-session\", \"expo-web-browser\"],\n      \"registryDependencies\": [\"https://reactnativereusables.com/r/uniwind/button.json\"]\n    }\n  ]\n}\n"
  },
  {
    "path": "apps/docs/scripts/generate-local-registry.js",
    "content": "// scripts/generate-local-registry.js\nconst fs = require('fs');\nconst path = require('path');\n\nconst registryDir = path.resolve('./registry');\nconst files = ['uniwind.json', 'nativewind.json'];\nconst targetDomain = 'https://reactnativereusables.com';\nconst localDomain = 'http://localhost:3000';\n\nfiles.forEach((file) => {\n  const srcPath = path.join(registryDir, file);\n  const destPath = path.join(registryDir, file.replace('.json', '.local.json'));\n\n  if (!fs.existsSync(srcPath)) {\n    console.error(`Source file not found: ${srcPath}`);\n    return;\n  }\n\n  try {\n    const content = fs.readFileSync(srcPath, 'utf-8');\n    const replaced = content.replace(new RegExp(targetDomain, 'g'), localDomain);\n\n    fs.writeFileSync(destPath, replaced, 'utf-8');\n    console.log(`Created/updated: ${destPath}`);\n  } catch (err) {\n    console.error(`Error processing ${file}:`, err);\n  }\n});\n"
  },
  {
    "path": "apps/docs/source.config.ts",
    "content": "import { fileGenerator } from '@docs/lib/file-generator';\nimport { remarkDocGen } from 'fumadocs-docgen';\nimport { defineConfig, defineDocs } from 'fumadocs-mdx/config';\n\nexport const { docs, meta } = defineDocs({\n  dir: 'content/docs',\n});\n\nexport default defineConfig({\n  mdxOptions: {\n    rehypeCodeOptions: {\n      themes: { light: 'github-dark-default', dark: 'github-dark-default' },\n      theme: 'github-dark-default',\n    },\n    remarkPlugins: [[remarkDocGen, { generators: [fileGenerator()] }]],\n  },\n});\n"
  },
  {
    "path": "apps/docs/src/content/docs/showcase/links/button.mdx",
    "content": "---\ntitle: \"Button\"\n---\n\n"
  },
  {
    "path": "apps/docs/src/content/docs/showcase/links/input.mdx",
    "content": "---\ntitle: \"Input\"\n---\n\n"
  },
  {
    "path": "apps/docs/src/content/docs/showcase/links/wrong.mdx",
    "content": "---\ntitle: \"Wrong\"\n---\n\n"
  },
  {
    "path": "apps/docs/src/content/docs/showcase/privacy-policy.mdx",
    "content": "---\ntitle: Privacy Policy\n---\n\nEffective Date: July 19, 2025\n\n<br/>\n\nThe React Native Reusables App (“the App”) is an interactive developer tool that allows users to explore, preview, and interact with a wide range of UI components and blocks provided by the React Native Reusables project. It is designed for developers and designers who want to evaluate, learn from, and integrate these components into their own applications.\n\n### 1. Information We Collect\nWe do not collect, store, or share any personal data.\nAt this time, the App does not require authentication and does not track user behavior, usage statistics, or analytics data.\n\n### 2. Authentication\nNo authentication mechanisms are currently implemented. If authentication is added in the future, this Privacy Policy will be updated to reflect that change.\n\n### 3. Data Usage and Sharing\nSince we do not collect any data, we do not share any data with third parties.\n\n### 4. Changes to This Policy\nWe may update this Privacy Policy if features change. If we do, we will revise the “Effective Date” at the top of this page. For any significant changes, we may provide additional notice within the app.\n\n### 5. Contact\nIf you have any questions about this Privacy Policy or the App, please contact us at:\nmrzachnugent@gmail.com"
  },
  {
    "path": "apps/docs/src/content/docs/showcase/support.mdx",
    "content": "---\ntitle: Support\n---\n\nEffective Date: July 26, 2025\n\n<br/>\n\nThe React Native Reusables App (“the App”) is an interactive developer tool that enables users to explore and implement UI components and blocks provided by the React Native Reusables project.\n\n### 1. How to Get Support\nIf you need help with the App or React Native Reusables, you can:\n- Browse the documentation available on this website.  \n- Open a discussion or report an issue on the [GitHub repository](https://github.com/mrzachnugent/react-native-reusables).  \n- Reach out directly by email at: **mrzachnugent@gmail.com**\n\n### 2. Response Time\nSupport inquiries will be reviewed as time permits. While there is no guaranteed response time, every effort will be made to address questions and issues promptly.\n\n### 3. Updates to Support Information\nSupport details may be updated in the future. When changes occur, they will be reflected on this page.\n\n### 4. Contact\nFor any additional assistance, contact:  \n**mrzachnugent@gmail.com**\n"
  },
  {
    "path": "apps/docs/tailwind.config.js",
    "content": "import { createPreset } from 'fumadocs-ui/tailwind-plugin';\nimport { fontFamily } from 'tailwindcss/defaultTheme';\n\n/** @type {import('tailwindcss').Config} */\nconst config = {\n  darkMode: ['class'],\n  content: [\n    './components/**/*.{ts,tsx}',\n    './app/**/*.{ts,tsx}',\n    './content/**/*.{md,mdx}',\n    './mdx-components.{ts,tsx}',\n    '../../node_modules/fumadocs-ui/dist/**/*.js',\n    './node_modules/@rnr/**/*.{ts,tsx}',\n  ],\n  presets: [\n    // eslint-disable-next-line @typescript-eslint/no-require-imports\n    require('nativewind/preset'),\n    createPreset({ preset: 'black' }),\n  ],\n  important: 'html',\n  theme: {\n    extend: {\n      fontFamily: {\n        sans: ['var(--font-sans)', ...fontFamily.sans],\n        mono: ['var(--font-mono)', ...fontFamily.mono],\n      },\n      colors: {\n        border: 'hsl(var(--border))',\n        input: 'hsl(var(--input))',\n        ring: 'hsl(var(--ring))',\n        background: 'hsl(var(--background))',\n        foreground: 'hsl(var(--foreground))',\n        primary: {\n          DEFAULT: 'hsl(var(--primary))',\n          foreground: 'hsl(var(--primary-foreground))',\n        },\n        secondary: {\n          DEFAULT: 'hsl(var(--secondary))',\n          foreground: 'hsl(var(--secondary-foreground))',\n        },\n        destructive: {\n          DEFAULT: 'hsl(var(--destructive))',\n          foreground: 'hsl(var(--destructive-foreground))',\n        },\n        muted: {\n          DEFAULT: 'hsl(var(--muted))',\n          foreground: 'hsl(var(--muted-foreground))',\n        },\n        accent: {\n          DEFAULT: 'hsl(var(--accent))',\n          foreground: 'hsl(var(--accent-foreground))',\n        },\n        popover: {\n          DEFAULT: 'hsl(var(--popover))',\n          foreground: 'hsl(var(--popover-foreground))',\n        },\n        card: {\n          DEFAULT: 'hsl(var(--card))',\n          foreground: 'hsl(var(--card-foreground))',\n        },\n        chart: {\n          1: 'hsl(var(--chart-1))',\n          2: 'hsl(var(--chart-2))',\n          3: 'hsl(var(--chart-3))',\n          4: 'hsl(var(--chart-4))',\n          5: 'hsl(var(--chart-5))',\n        },\n      },\n      keyframes: {\n        'accordion-down': {\n          from: {\n            height: '0',\n          },\n          to: {\n            height: 'var(--radix-accordion-content-height)',\n          },\n        },\n        'accordion-up': {\n          from: {\n            height: 'var(--radix-accordion-content-height)',\n          },\n          to: {\n            height: '0',\n          },\n        },\n      },\n      animation: {\n        'accordion-down': 'accordion-down 0.2s ease-out',\n        'accordion-up': 'accordion-up 0.2s ease-out',\n      },\n      borderRadius: {\n        lg: 'var(--radius)',\n        md: 'calc(var(--radius) - 2px)',\n        sm: 'calc(var(--radius) - 4px)',\n      },\n    },\n  },\n  future: {\n    hoverOnlyWhenSupported: true,\n  },\n  plugins: [\n    // eslint-disable-next-line @typescript-eslint/no-require-imports\n    require('tailwindcss-animate'),\n  ],\n};\n\nexport default config;\n"
  },
  {
    "path": "apps/docs/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"jsxImportSource\": \"nativewind\",\n    \"baseUrl\": \".\",\n    \"target\": \"ESNext\",\n    \"lib\": [\n      \"dom\",\n      \"dom.iterable\",\n      \"esnext\"\n    ],\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    \"paths\": {\n      \"@docs/*\": [\n        \"./*\"\n      ],\n      \"@/registry/*\": [\n        \"../../packages/registry/src/*\"\n      ]\n    },\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ]\n  },\n  \"include\": [\n    \"**/*.ts\",\n    \"**/*.tsx\",\n    \".next/types/**/*.ts\",\n    \"global.d.ts\",\n    \"nativewind-env.d.ts\",\n    \"next-env.d.ts\",\n    \"dist/types/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}"
  },
  {
    "path": "apps/docs/vercel.json",
    "content": "{\n  \"$schema\": \"https://openapi.vercel.sh/vercel.json\",\n  \"framework\": \"nextjs\"\n}\n"
  },
  {
    "path": "apps/showcase/.gitignore",
    "content": "# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files\n\n# dependencies\nnode_modules/\n\n# Expo\n.expo/\ndist/\nweb-build/\nios/\nandroid/\n\n# Native\n*.orig.*\n*.jks\n*.p8\n*.p12\n*.key\n*.mobileprovision\n\n# Metro\n.metro-health-check*\n\n# debug\nnpm-debug.*\nyarn-debug.*\nyarn-error.*\n\n# macOS\n.DS_Store\n*.pem\n\n# local env files\n.env*.local\n\n# typescript\n*.tsbuildinfo\n\n# @generated expo-cli sync-2b81b286409207a5da26e14c78851eb30d8ccbdb\n# The following patterns were generated by expo-cli\n\nexpo-env.d.ts\n# @end expo-cli"
  },
  {
    "path": "apps/showcase/app/+html.tsx",
    "content": "import { ScrollViewStyleReset } from 'expo-router/html';\nimport type { PropsWithChildren } from 'react';\n\n// This file is web-only and used to configure the root HTML for every\n// web page during static rendering.\n// The contents of this function only run in Node.js environments and\n// do not have access to the DOM or browser APIs.\nexport default function Root({ children }: PropsWithChildren) {\n  return (\n    <html lang=\"en\" className=\"bg-background\">\n      <head>\n        <meta charSet=\"utf-8\" />\n        <meta httpEquiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\" />\n\n        {/*\n          Disable body scrolling on web. This makes ScrollView components work closer to how they do on native.\n          However, body scrolling is often nice to have for mobile web. If you want to enable it, remove this line.\n        */}\n        <ScrollViewStyleReset />\n\n        {/* Add any additional <head> elements that you want globally available on web... */}\n      </head>\n      <body>{children}</body>\n    </html>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/+not-found.tsx",
    "content": "import { Text } from '@/registry/nativewind/components/ui/text';\nimport { Link, Stack } from 'expo-router';\nimport { View } from 'react-native';\n\nexport default function NotFoundScreen() {\n  return (\n    <>\n      <Stack.Screen options={{ title: 'Oops!' }} />\n      <View className=\"flex-1 items-center justify-center gap-3\">\n        <Text className=\"text-3xl\">This screen doesn't exist.</Text>\n        <View className=\"h-2\" />\n        <Link href=\"/\">\n          <Text>Go Home</Text>\n        </Link>\n      </View>\n    </>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/_layout.tsx",
    "content": "import '../global.css';\n\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { ThemeProvider } from '@react-navigation/native';\nimport { PortalHost } from '@rn-primitives/portal';\nimport { HeaderRightView } from '@showcase/components/header-right-view';\nimport { useGeistFont } from '@showcase/hooks/use-geist-font';\nimport { NAV_THEME } from '@showcase/lib/theme';\nimport { Stack } from 'expo-router';\nimport * as SplashScreen from 'expo-splash-screen';\nimport { StatusBar } from 'expo-status-bar';\nimport { useColorScheme } from 'nativewind';\nimport * as React from 'react';\nimport { Platform } from 'react-native';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\nimport { KeyboardProvider } from 'react-native-keyboard-controller';\n\nSplashScreen.preventAutoHideAsync();\n\nexport {\n  // Catch any errors thrown by the Layout component.\n  ErrorBoundary,\n} from 'expo-router';\n\nexport const unstable_settings = {\n  // Ensure that reloading on `/modal` keeps a back button present.\n  initialRouteName: 'index',\n};\n\nexport default function RootLayout() {\n  const [loaded, error] = useGeistFont();\n  const { colorScheme } = useColorScheme();\n\n  React.useEffect(() => {\n    if (loaded || error) {\n      SplashScreen.hideAsync();\n    }\n  }, [loaded, error]);\n\n  if (!loaded && !error) {\n    return null;\n  }\n\n  return (\n    <ThemeProvider value={NAV_THEME[colorScheme]}>\n      <StatusBar style={colorScheme === 'dark' ? 'light' : 'dark'} />\n      <GestureHandlerRootView\n        style={{ flex: 1, backgroundColor: NAV_THEME[colorScheme].colors.background }}>\n        <KeyboardProvider>\n          <Stack\n            screenOptions={{\n              headerBackTitle: 'Back',\n              headerTitle(props) {\n                return (\n                  <Text className=\"ios:font-medium android:mt-1.5 text-xl\">\n                    {toOptions(props.children.split('/').pop())}\n                  </Text>\n                );\n              },\n              headerRight: () => <HeaderRightView />,\n            }}>\n            <Stack.Screen\n              name=\"index\"\n              options={{\n                headerLargeTitle: true,\n                headerTitle: 'Showcase',\n                headerLargeTitleShadowVisible: false,\n                headerShadowVisible: false,\n                headerTransparent: Platform.OS === 'ios',\n\n              }}\n            />\n          </Stack>\n          <PortalHost />\n        </KeyboardProvider>\n      </GestureHandlerRootView>\n    </ThemeProvider>\n  );\n}\n\nfunction toOptions(name: string) {\n  const title = name\n    .split('-')\n    .map(function (str: string) {\n      return str.replace(/\\b\\w/g, function (char) {\n        return char.toUpperCase();\n      });\n    })\n    .join(' ');\n  return title;\n}\n"
  },
  {
    "path": "apps/showcase/app/components/accordion.tsx",
    "content": "import { AccordionPreview } from '@/registry/examples/accordion';\nimport { View } from 'react-native';\n\nexport default function AccordionScreen() {\n  return (\n    <View className=\"items-center px-6\">\n      <AccordionPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/alert-dialog.tsx",
    "content": "import { AlertDialogPreview } from '@/registry/examples/alert-dialog';\nimport { View } from 'react-native';\n\nexport default function AlertDialogScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center\">\n      <AlertDialogPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/alert.tsx",
    "content": "import { AlertPreview } from '@/registry/examples/alert';\nimport { View } from 'react-native';\n\nexport default function AlertScreen() {\n  return (\n    <View className=\"items-center p-6\">\n      <AlertPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/aspect-ratio.tsx",
    "content": "import { View } from 'react-native';\nimport { AspectRatioPreview } from '@/registry/examples/aspect-ratio';\n\nexport default function AspectRatioScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center px-6\">\n      <AspectRatioPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/avatar.tsx",
    "content": "import { View } from 'react-native';\nimport { AvatarPreview } from '@/registry/examples/avatar';\n\nexport default function AvatarScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center gap-12 p-6\">\n      <AvatarPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/badge.tsx",
    "content": "import { BadgePreview } from '@/registry/examples/badge';\nimport { View } from 'react-native';\n\nexport default function BadgeScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center gap-5\">\n      <BadgePreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/button.tsx",
    "content": "import { PreviewCarousel } from '@showcase/components/preview-carousel';\nimport {\n  ButtonDestructivePreview,\n  ButtonGhostPreview,\n  ButtonIconPreview,\n  ButtonLinkPreview,\n  ButtonLoadingPreview,\n  ButtonOutlinePreview,\n  ButtonPreview,\n  ButtonSecondaryPreview,\n  ButtonWithIconPreview,\n} from '@/registry/examples/button';\nimport * as React from 'react';\n\nconst buttonPreviews = [\n  { name: 'Default', component: ButtonPreview },\n  { name: 'Destructive', component: ButtonDestructivePreview },\n  { name: 'Ghost', component: ButtonGhostPreview },\n  { name: 'Link', component: ButtonLinkPreview },\n  { name: 'Loading', component: ButtonLoadingPreview },\n  { name: 'Outline', component: ButtonOutlinePreview },\n  { name: 'Secondary', component: ButtonSecondaryPreview },\n  { name: 'With Icon', component: ButtonWithIconPreview },\n  { name: 'Icon', component: ButtonIconPreview },\n];\n\nexport default function ButtonScreen() {\n  return <PreviewCarousel previews={buttonPreviews} />;\n}\n"
  },
  {
    "path": "apps/showcase/app/components/card.tsx",
    "content": "import { CardPreview } from '@/registry/examples/card';\nimport { KeyboardAwareScrollView, KeyboardGestureArea } from 'react-native-keyboard-controller';\n\nexport default function CardScreen() {\n  return (\n    <KeyboardGestureArea interpolator=\"ios\" style={{ flex: 1 }}>\n      <KeyboardAwareScrollView\n        contentContainerClassName=\"flex-1 justify-center items-center p-6\"\n        keyboardDismissMode=\"interactive\"\n        keyboardShouldPersistTaps=\"handled\">\n        <CardPreview />\n      </KeyboardAwareScrollView>\n    </KeyboardGestureArea>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/checkbox.tsx",
    "content": "import * as React from 'react';\nimport { View } from 'react-native';\nimport { CheckboxPreview } from '@/registry/examples/checkbox';\n\nexport default function CheckboxScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center p-8\">\n      <CheckboxPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/collapsible.tsx",
    "content": "import { CollapsiblePreview } from '@/registry/examples/collapsible';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport default function CollapsibleScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center p-8\">\n      <CollapsiblePreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/context-menu.tsx",
    "content": "import { ContextMenuPreview } from '@/registry/examples/context-menu';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport default function ContextScreen() {\n  return (\n    <View className=\"flex-1 items-center gap-12 p-6\">\n      <ContextMenuPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/dialog.tsx",
    "content": "import { ScrollView } from 'react-native';\nimport { DialogPreview } from '@/registry/examples/dialog';\n\nexport default function DialogScreen() {\n  return (\n    <ScrollView contentContainerClassName=\"flex-1 justify-center items-center p-6\">\n      <DialogPreview />\n    </ScrollView>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/dropdown-menu.tsx",
    "content": "import { DropdownMenuPreview } from '@/registry/examples/dropdown-menu';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport default function DropdownMenuScreen() {\n  return (\n    <View className=\"flex-1 items-center gap-12 p-6\">\n      <DropdownMenuPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/hover-card.tsx",
    "content": "import { HoverCardPreview } from '@/registry/examples/hover-card';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport default function HoverCardScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center gap-12 p-6\">\n      <HoverCardPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/input.tsx",
    "content": "import { InputPreview } from '@/registry/examples/input';\nimport * as React from 'react';\nimport { View } from 'react-native';\nimport { KeyboardAwareScrollView, KeyboardGestureArea } from 'react-native-keyboard-controller';\n\nexport default function InputScreen() {\n  return (\n    <KeyboardGestureArea interpolator=\"ios\" style={{ flex: 1 }}>\n      <KeyboardAwareScrollView\n        contentContainerClassName=\"flex-1 justify-center items-center p-6\"\n        keyboardDismissMode=\"interactive\"\n        keyboardShouldPersistTaps=\"handled\">\n        <View className=\"max-auto w-full max-w-sm\">\n          <InputPreview />\n        </View>\n      </KeyboardAwareScrollView>\n    </KeyboardGestureArea>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/label.tsx",
    "content": "import { LabelPreview } from '@/registry/examples/label';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport default function LabelScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center gap-12 p-6\">\n      <LabelPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/menubar.tsx",
    "content": "import { MenubarPreview } from '@/registry/examples/menubar';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport default function MenubarScreen() {\n  return (\n    <View className=\"flex-1 items-center p-4\">\n      <MenubarPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/popover.tsx",
    "content": "import { PopoverPreview } from '@/registry/examples/popover';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport default function PopoverScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center p-6\">\n      <PopoverPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/progress.tsx",
    "content": "import { ProgressPreview } from '@/registry/examples/progress';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport default function ProgressScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center gap-12 p-6\">\n      <ProgressPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/radio-group.tsx",
    "content": "import { RadioGroupPreview } from '@/registry/examples/radio-group';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport default function RadioGroupScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center p-6\">\n      <RadioGroupPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/select.tsx",
    "content": "import { PreviewCarousel } from '@showcase/components/preview-carousel';\nimport { ScrollableSelectPreview, SelectPreview } from '@/registry/examples/select';\nimport * as React from 'react';\n\nconst selectPreviews = [\n  { name: 'Default', component: SelectPreview },\n  { name: 'Scrollable', component: ScrollableSelectPreview },\n];\n\nexport default function SelectScreen() {\n  return <PreviewCarousel previews={selectPreviews} />;\n}\n"
  },
  {
    "path": "apps/showcase/app/components/separator.tsx",
    "content": "import { SeparatorPreview } from '@/registry/examples/separator';\nimport { View } from 'react-native';\n\nexport default function SeparatorScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center gap-12 p-6\">\n      <View className=\"w-full max-w-xs\">\n        <SeparatorPreview />\n      </View>\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/skeleton.tsx",
    "content": "import { SkeletonPreview } from '@/registry/examples/skeleton';\nimport { View } from 'react-native';\n\nexport default function SkeletonScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center\">\n      <SkeletonPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/switch.tsx",
    "content": "import { SwitchPreview } from '@/registry/examples/switch';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport default function SwitchScreen() {\n  return (\n    <>\n      <View className=\"flex-1 items-center justify-center gap-12 p-6\">\n        <SwitchPreview />\n      </View>\n    </>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/tabs.tsx",
    "content": "import { TabsPreview } from '@/registry/examples/tabs';\nimport { View } from 'react-native';\n\nexport default function TabsScreen() {\n  return (\n    <View className=\"flex-1 p-6\">\n      <TabsPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/text.tsx",
    "content": "import { TextCascadePreview, TextPreview, TextTypographyPreview } from '@/registry/examples/text';\nimport { PreviewCarousel } from '@showcase/components/preview-carousel';\n\nconst textPreviews = [\n  { name: 'Default', component: TextPreview },\n  { name: 'Typography', component: TextTypographyPreview },\n  { name: 'Cascade', component: TextCascadePreview },\n];\n\nexport default function TextScreen() {\n  return <PreviewCarousel previews={textPreviews} removeBottomSafeArea />;\n}\n"
  },
  {
    "path": "apps/showcase/app/components/textarea.tsx",
    "content": "import { TextareaPreview } from '@/registry/examples/textarea';\nimport { View } from 'react-native';\nimport { KeyboardAwareScrollView, KeyboardGestureArea } from 'react-native-keyboard-controller';\n\nexport default function InputScreen() {\n  return (\n    <KeyboardGestureArea interpolator=\"ios\" style={{ flex: 1 }}>\n      <KeyboardAwareScrollView\n        contentContainerClassName=\"flex-1 justify-center items-center p-6\"\n        keyboardDismissMode=\"interactive\"\n        keyboardShouldPersistTaps=\"handled\">\n        <View className=\"max-auto w-full max-w-sm\">\n          <TextareaPreview />\n        </View>\n      </KeyboardAwareScrollView>\n    </KeyboardGestureArea>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/toggle-group.tsx",
    "content": "import { ToggleGroupPreview } from '@/registry/examples/toggle-group';\nimport { View } from 'react-native';\n\nexport default function ToggleGroupScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center gap-12 p-6\">\n      <ToggleGroupPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/toggle.tsx",
    "content": "import { TogglePreview } from '@/registry/examples/toggle';\nimport { View } from 'react-native';\n\nexport default function ToggleScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center gap-12 p-6\">\n      <TogglePreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/components/tooltip.tsx",
    "content": "import { TooltipPreview } from '@/registry/examples/tooltip';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport default function TooltipScreen() {\n  return (\n    <View className=\"flex-1 items-center justify-center p-6\">\n      <TooltipPreview />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/index.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport { Button } from '@/registry/nativewind/components/ui/button';\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { useScrollToTop } from '@react-navigation/native';\nimport { FlashList } from '@shopify/flash-list';\nimport { COMPONENTS } from '@showcase/lib/constants';\nimport { Link } from 'expo-router';\nimport { ChevronRight } from 'lucide-react-native';\nimport { cssInterop, useColorScheme } from 'nativewind';\nimport * as React from 'react';\nimport { Animated, Platform, View } from 'react-native';\n\nconst AnimatedFlashList = Animated.createAnimatedComponent(FlashList);\n\ncssInterop(AnimatedFlashList, { className: 'style', contentContainerClassName: 'contentContainerStyle' });\n\nexport default function ComponentsScreen() {\n  const { colorScheme } = useColorScheme();\n  const [search, setSearch] = React.useState('');\n  const [isAtTop, setIsAtTop] = React.useState(true);\n  const isAtTopRef = React.useRef(true);\n  const flashListRef = React.useRef(null);\n  useScrollToTop(flashListRef);\n\n  const data = !search\n    ? COMPONENTS\n    : COMPONENTS.filter((item) => item.name.toLowerCase().includes(search.toLowerCase()));\n\n  return (\n    <View\n      className={cn(\n        'web:p-4 mx-auto w-full max-w-lg flex-1',\n        Platform.select({ android: cn('border-border/0 border-t', !isAtTop && 'border-border') })\n      )}>\n      <FlashList\n        ref={flashListRef}\n        data={data}\n        onScroll={Platform.select({\n          android: ({ nativeEvent }) => {\n            const isScrollAtTop = nativeEvent.contentOffset.y <= 0;\n            if (isScrollAtTop !== isAtTopRef.current) {\n              isAtTopRef.current = isScrollAtTop;\n              setIsAtTop(isScrollAtTop);\n            }\n          },\n        })}\n        scrollToOverflowEnabled={Platform.OS === 'ios'}\n        contentInsetAdjustmentBehavior=\"automatic\"\n        contentContainerClassName=\"px-4 pb-2\"\n        keyboardShouldPersistTaps=\"handled\"\n        keyboardDismissMode=\"on-drag\"\n        showsVerticalScrollIndicator={false}\n        ListHeaderComponent={Platform.select({\n          native: (\n            <View className=\"pb-4\">\n              <Input\n                placeholder=\"Components\"\n                clearButtonMode=\"always\"\n                onChangeText={setSearch}\n                autoCorrect={false}\n                onFocus={Platform.select({\n                  ios: () => {\n                    flashListRef.current?.scrollToOffset({ offset: -116, animated: true });\n                  }\n                })}\n              />\n            </View>\n          ),\n        })}\n        renderItem={({ item, index }) => (\n          <Link href={`/components/${item.slug}`} asChild>\n            <Link.Trigger>\n              <Button\n                variant=\"outline\"\n                size=\"lg\"\n                unstable_pressDelay={100}\n                className={cn(\n                  'dark:bg-background border-border flex-row justify-between rounded-none border-b-0 pl-4 pr-3.5',\n                  index === 0 && 'rounded-t-lg',\n                  index === data.length - 1 && 'rounded-b-lg border-b'\n                )}>\n                <Text className=\"text-base font-normal\">{item.name}</Text>\n\n                <Icon as={ChevronRight} className=\"text-muted-foreground size-4 stroke-[1.5px]\" />\n              </Button>\n            </Link.Trigger>\n            <Link.Preview style={{ backgroundColor: colorScheme === 'dark' ? 'black' : 'white' }} />\n          </Link>\n        )}\n        ListFooterComponent={<View className=\"android:pb-safe\" />}\n      />\n    </View>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/app/showcase/links/[slug].tsx",
    "content": "import { COMPONENTS } from '@showcase/lib/constants';\nimport { Stack, useFocusEffect, useLocalSearchParams, useRouter } from 'expo-router';\n\nexport default function Screen() {\n  const { slug } = useLocalSearchParams();\n  const router = useRouter();\n\n  useFocusEffect(() => {\n    try {\n      const item = Array.isArray(slug) ? slug[0] : slug;\n\n      if (getIsComponent(item)) {\n        router.replace(`/components/${item}`);\n        return;\n      }\n      // Fallback to home\n      router.replace('/');\n    } catch (error) {\n      console.error(error);\n    }\n  });\n\n  return <Stack.Screen options={{ headerShown: false }} />;\n}\n\nfunction getIsComponent(slug: string) {\n  return COMPONENTS.some((component) => component.slug === slug);\n}\n"
  },
  {
    "path": "apps/showcase/app.config.ts",
    "content": "import { ExpoConfig, ConfigContext } from 'expo/config';\n\nexport default ({ config }: ConfigContext): ExpoConfig => {\n  const { NAME, SLUG } = getConfig();\n\n  return {\n    ...config,\n    name: NAME,\n    slug: SLUG,\n    version: '0.0.3',\n    orientation: 'portrait',\n    icon: './assets/images/icon.png',\n    userInterfaceStyle: 'automatic',\n    runtimeVersion: {\n      policy: 'appVersion',\n    },\n    updates: {\n      url: 'https://u.expo.dev/ceb86f7d-1fed-4feb-98cb-2f2ba6223741',\n    },\n    splash: {\n      image: './assets/images/splash.png',\n      resizeMode: 'contain',\n      backgroundColor: '#0A0A0A',\n    },\n    assetBundlePatterns: ['**/*'],\n    ios: {\n      scheme: SLUG,\n      supportsTablet: true,\n      bundleIdentifier: 'com.reactnativereusables.app',\n      associatedDomains: ['applinks:reactnativereusables.com'],\n      infoPlist: {\n        ITSAppUsesNonExemptEncryption: false,\n      },\n    },\n    android: {\n      scheme: `${SLUG}android`,\n      adaptiveIcon: {\n        foregroundImage: './assets/images/adaptive-icon.png',\n        backgroundColor: '#0A0A0A',\n      },\n      package: 'com.reactnativereusables.android',\n      intentFilters: [\n        {\n          action: 'VIEW',\n          autoVerify: true,\n          data: [\n            {\n              scheme: 'https',\n              host: 'reactnativereusables.com',\n              pathPrefix: '/showcase/links',\n            },\n          ],\n          category: ['BROWSABLE', 'DEFAULT'],\n        },\n      ],\n    },\n    web: {\n      bundler: 'metro',\n      output: 'static',\n      favicon: './assets/images/favicon.png',\n    },\n    plugins: [\n      'expo-router',\n      [\n        'expo-font',\n        {\n          fonts: [\n            '../../node_modules/@expo-google-fonts/geist/900Black/Geist_900Black.ttf',\n            '../../node_modules/@expo-google-fonts/geist/800ExtraBold/Geist_800ExtraBold.ttf',\n            '../../node_modules/@expo-google-fonts/geist/700Bold/Geist_700Bold.ttf',\n            '../../node_modules/@expo-google-fonts/geist/600SemiBold/Geist_600SemiBold.ttf',\n            '../../node_modules/@expo-google-fonts/geist/500Medium/Geist_500Medium.ttf',\n            '../../node_modules/@expo-google-fonts/geist/400Regular/Geist_400Regular.ttf',\n            '../../node_modules/@expo-google-fonts/geist/300Light/Geist_300Light.ttf',\n            '../../node_modules/@expo-google-fonts/geist/200ExtraLight/Geist_200ExtraLight.ttf',\n            '../../node_modules/@expo-google-fonts/geist/100Thin/Geist_100Thin.ttf',\n          ],\n        },\n      ],\n    ],\n    experiments: {\n      typedRoutes: true,\n    },\n    extra: {\n      router: {\n        origin: false,\n      },\n      eas: {\n        projectId: 'ceb86f7d-1fed-4feb-98cb-2f2ba6223741',\n      },\n    },\n  };\n};\n\nfunction getConfig() {\n  const IS_DEV = process.env.ENV === 'development';\n\n  const NAME = IS_DEV ? 'Dev React Native Reusables' : 'React Native Reusables';\n  const SLUG = IS_DEV ? 'devreactnativereusablesshowcase' : 'reactnativereusablesshowcase';\n\n  return { NAME, SLUG };\n}\n"
  },
  {
    "path": "apps/showcase/babel.config.js",
    "content": "module.exports = {\n  presets: [['babel-preset-expo', { jsxImportSource: 'nativewind' }], 'nativewind/babel'],\n};\n"
  },
  {
    "path": "apps/showcase/components/header-right-view.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { ThemeToggle } from '@showcase/components/theme-toggle';\nimport * as Updates from 'expo-updates';\nimport * as React from 'react';\nimport { ActivityIndicator } from 'react-native';\n\nexport function HeaderRightView() {\n  const { isUpdateAvailable, isUpdatePending, isDownloading } = Updates.useUpdates();\n\n  async function onReload() {\n    try {\n      if (!isUpdatePending) {\n        await Updates.fetchUpdateAsync();\n      }\n      await Updates.reloadAsync();\n    } catch (error) {\n      console.error(error);\n    }\n  }\n\n  if (isUpdateAvailable) {\n    return (\n      <Button\n        size=\"sm\"\n        className=\"h-7 rounded-full bg-transparent active:bg-transparent\"\n        onPress={onReload}\n        disabled={isDownloading}>\n        {isDownloading ? (\n          <ActivityIndicator color=\"white\" size=\"small\" className=\"scale-75\" />\n        ) : (\n          <Text className=\"text-sky-600 dark:text-sky-500\">Update</Text>\n        )}\n      </Button>\n    );\n  }\n\n  return <ThemeToggle />;\n}\n"
  },
  {
    "path": "apps/showcase/components/preview-carousel.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport { Button } from '@/registry/nativewind/components/ui/button';\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { ChevronLeftIcon, ChevronRightIcon } from 'lucide-react-native';\nimport * as React from 'react';\nimport { useState } from 'react';\nimport {\n  Dimensions,\n  FlatList,\n  ListRenderItemInfo,\n  NativeScrollEvent,\n  NativeSyntheticEvent,\n  View,\n} from 'react-native';\n\nconst windowWidth = Dimensions.get('window').width;\n\ntype PreviewCarouselProps = {\n  previews: { name: string; component: (props: unknown) => React.JSX.Element }[];\n  removeBottomSafeArea?: boolean;\n};\n\nfunction PreviewCarousel({ previews, removeBottomSafeArea = false }: PreviewCarouselProps) {\n  const [index, setIndex] = useState(0);\n  const ref = React.useRef<FlatList>(null);\n\n  function onScroll(ev: NativeSyntheticEvent<NativeScrollEvent>) {\n    const index = Math.round(ev.nativeEvent.contentOffset.x / windowWidth);\n    setIndex(index);\n  }\n\n  function onPreviewPress() {\n    ref.current?.scrollToIndex({ index: Math.max(0, index - 1) });\n  }\n\n  function onNextPress() {\n    ref.current?.scrollToIndex({ index: Math.min(previews.length - 1, index + 1) });\n  }\n\n  return (\n    <>\n      <FlatList\n        ref={ref}\n        data={previews}\n        renderItem={renderItem}\n        onScroll={onScroll}\n        keyExtractor={keyExtractor}\n        horizontal\n        snapToInterval={windowWidth}\n        decelerationRate=\"fast\"\n        showsHorizontalScrollIndicator={false}\n        contentContainerClassName={cn(!removeBottomSafeArea && 'pb-12 mb-safe')}\n      />\n      <View className=\"mb-safe absolute bottom-0 left-0 right-0 h-12 flex-row items-center justify-center px-4\">\n        <View className=\"relative flex-row items-center justify-center gap-2\">\n          <View className=\"bg-background rounded-md\">\n            <Button variant=\"outline\" size=\"icon\" disabled={index === 0} onPress={onPreviewPress}>\n              <Icon as={ChevronLeftIcon} className=\"size-4\" />\n            </Button>\n          </View>\n          <View className=\"bg-background rounded-md\">\n            <Button\n              variant=\"outline\"\n              size=\"icon\"\n              disabled={index === previews.length - 1}\n              onPress={onNextPress}>\n              <Icon as={ChevronRightIcon} className=\"size-4\" />\n            </Button>\n          </View>\n        </View>\n      </View>\n    </>\n  );\n}\n\nexport { PreviewCarousel };\n\nfunction renderItem({\n  item,\n}: ListRenderItemInfo<{ name: string; component: (props: unknown) => React.JSX.Element }>) {\n  const Component = item.component;\n  return (\n    <View className=\"w-screen flex-1 items-center justify-center\">\n      <Component />\n    </View>\n  );\n}\n\nfunction keyExtractor(item: { name: string }) {\n  return item.name;\n}\n"
  },
  {
    "path": "apps/showcase/components/theme-toggle.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport * as Haptics from 'expo-haptics';\nimport { useColorScheme } from 'nativewind';\nimport { Image, type ImageStyle } from 'react-native';\n\nconst THEME_TOGGLE_IMAGES = {\n  light: require('@showcase/assets/images/theme-toggle-light.png'),\n  dark: require('@showcase/assets/images/theme-toggle-dark.png'),\n};\n\nconst IMAGE_STYLE: ImageStyle = {\n  height: 22,\n  width: 22,\n};\n\nexport function ThemeToggle() {\n  const { colorScheme, setColorScheme } = useColorScheme();\n\n  function toggleColorScheme() {\n    Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Heavy);\n    const newTheme = colorScheme === 'dark' ? 'light' : 'dark';\n    setColorScheme(newTheme);\n  }\n\n  return (\n    <Button\n      onPress={toggleColorScheme}\n      variant=\"ghost\"\n      size=\"icon\"\n      className=\"web:mr-5 size-9 rounded-full\">\n      <Image source={THEME_TOGGLE_IMAGES[colorScheme]} style={IMAGE_STYLE} />\n    </Button>\n  );\n}\n"
  },
  {
    "path": "apps/showcase/components.json",
    "content": "{\n  \"$schema\": \"https://ui.shadcn.com/schema.json\",\n  \"style\": \"default\",\n  \"rsc\": false,\n  \"tsx\": true,\n  \"tailwind\": {\n    \"config\": \"tailwind.config.js\",\n    \"css\": \"global.css\",\n    \"baseColor\": \"neutral\",\n    \"cssVariables\": true\n  },\n  \"aliases\": {\n    \"components\": \"@showcase/components\",\n    \"utils\": \"@showcase/lib/utils\",\n    \"ui\": \"@showcase/components/ui\",\n    \"lib\": \"@showcase/lib\",\n    \"hooks\": \"@showcase/hooks\"\n  }\n}\n"
  },
  {
    "path": "apps/showcase/eas.json",
    "content": "{\n  \"cli\": {\n    \"version\": \">= 5.4.0\",\n    \"appVersionSource\": \"remote\"\n  },\n  \"build\": {\n    \"development\": {\n      \"developmentClient\": true,\n      \"distribution\": \"internal\",\n      \"channel\": \"development\"\n    },\n    \"preview\": {\n      \"distribution\": \"internal\",\n      \"channel\": \"preview\"\n    },\n    \"production\": {\n      \"autoIncrement\": true,\n      \"channel\": \"prod-0.0.3\"\n    }\n  },\n  \"submit\": {\n    \"production\": {}\n  }\n}"
  },
  {
    "path": "apps/showcase/global.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n@layer base {\n  :root {\n    --background: 0 0% 100%;\n    --foreground: 0 0% 3.9%;\n    --card: 0 0% 100%;\n    --card-foreground: 0 0% 3.9%;\n    --popover: 0 0% 100%;\n    --popover-foreground: 0 0% 3.9%;\n    --primary: 0 0% 9%;\n    --primary-foreground: 0 0% 98%;\n    --secondary: 0 0% 96.1%;\n    --secondary-foreground: 0 0% 9%;\n    --muted: 0 0% 96.1%;\n    --muted-foreground: 0 0% 45.1%;\n    --accent: 0 0% 96.1%;\n    --accent-foreground: 0 0% 9%;\n    --destructive: 0 84.2% 60.2%;\n    --border: 0 0% 89.8%;\n    --input: 0 0% 89.8%;\n    --ring: 0 0% 63%;\n    --radius: 0.625rem;\n    --chart-1: 12 76% 61%;\n    --chart-2: 173 58% 39%;\n    --chart-3: 197 37% 24%;\n    --chart-4: 43 74% 66%;\n    --chart-5: 27 87% 67%;\n  }\n\n  .dark:root {\n    --background: 0 0% 3.9%;\n    --foreground: 0 0% 98%;\n    --card: 0 0% 3.9%;\n    --card-foreground: 0 0% 98%;\n    --popover: 0 0% 3.9%;\n    --popover-foreground: 0 0% 98%;\n    --primary: 0 0% 98%;\n    --primary-foreground: 0 0% 9%;\n    --secondary: 0 0% 14.9%;\n    --secondary-foreground: 0 0% 98%;\n    --muted: 0 0% 14.9%;\n    --muted-foreground: 0 0% 63.9%;\n    --accent: 0 0% 14.9%;\n    --accent-foreground: 0 0% 98%;\n    --destructive: 0 70.9% 59.4%;\n    --border: 0 0% 14.9%;\n    --input: 0 0% 14.9%;\n    --ring: 300 0% 45%;\n    --chart-1: 220 70% 50%;\n    --chart-2: 160 60% 45%;\n    --chart-3: 30 80% 55%;\n    --chart-4: 280 65% 60%;\n    --chart-5: 340 75% 55%;\n  }\n}\n"
  },
  {
    "path": "apps/showcase/hooks/use-geist-font.tsx",
    "content": "import { useFonts } from '@expo-google-fonts/geist/useFonts';\nimport { Geist_100Thin } from '@expo-google-fonts/geist/100Thin';\nimport { Geist_200ExtraLight } from '@expo-google-fonts/geist/200ExtraLight';\nimport { Geist_300Light } from '@expo-google-fonts/geist/300Light';\nimport { Geist_400Regular } from '@expo-google-fonts/geist/400Regular';\nimport { Geist_500Medium } from '@expo-google-fonts/geist/500Medium';\nimport { Geist_600SemiBold } from '@expo-google-fonts/geist/600SemiBold';\nimport { Geist_700Bold } from '@expo-google-fonts/geist/700Bold';\nimport { Geist_800ExtraBold } from '@expo-google-fonts/geist/800ExtraBold';\nimport { Geist_900Black } from '@expo-google-fonts/geist/900Black';\n\nfunction useGeistFont() {\n  return useFonts({\n    Geist_100Thin,\n    Geist_200ExtraLight,\n    Geist_300Light,\n    Geist_400Regular,\n    Geist_500Medium,\n    Geist_600SemiBold,\n    Geist_700Bold,\n    Geist_800ExtraBold,\n    Geist_900Black,\n  });\n}\n\nexport { useGeistFont };\n"
  },
  {
    "path": "apps/showcase/index.js",
    "content": "import { registerRootComponent } from 'expo';\nimport { ExpoRoot } from 'expo-router';\n\n// Must be exported or Fast Refresh won't update the context\nexport function App() {\n  const ctx = require.context('./app');\n  return <ExpoRoot context={ctx} />;\n}\n\nregisterRootComponent(App);\n"
  },
  {
    "path": "apps/showcase/lib/constants.ts",
    "content": "export const COMPONENTS = [\n  { slug: 'accordion', name: 'Accordion' },\n  { slug: 'alert', name: 'Alert' },\n  { slug: 'alert-dialog', name: 'Alert Dialog' },\n  { slug: 'aspect-ratio', name: 'Aspect Ratio' },\n  { slug: 'avatar', name: 'Avatar' },\n  { slug: 'badge', name: 'Badge' },\n  { slug: 'button', name: 'Button' },\n  { slug: 'card', name: 'Card' },\n  { slug: 'checkbox', name: 'Checkbox' },\n  { slug: 'collapsible', name: 'Collapsible' },\n  { slug: 'context-menu', name: 'Context Menu' },\n  { slug: 'dialog', name: 'Dialog' },\n  { slug: 'dropdown-menu', name: 'Dropdown Menu' },\n  { slug: 'hover-card', name: 'Hover Card' },\n  { slug: 'input', name: 'Input' },\n  { slug: 'label', name: 'Label' },\n  { slug: 'menubar', name: 'Menubar' },\n  { slug: 'popover', name: 'Popover' },\n  { slug: 'progress', name: 'Progress' },\n  { slug: 'radio-group', name: 'Radio Group' },\n  { slug: 'select', name: 'Select' },\n  { slug: 'separator', name: 'Separator' },\n  { slug: 'skeleton', name: 'Skeleton' },\n  { slug: 'switch', name: 'Switch' },\n  { slug: 'tabs', name: 'Tabs' },\n  { slug: 'text', name: 'Text' },\n  { slug: 'textarea', name: 'Textarea' },\n  { slug: 'toggle', name: 'Toggle' },\n  { slug: 'toggle-group', name: 'Toggle Group' },\n  { slug: 'tooltip', name: 'Tooltip' },\n] as const;\n"
  },
  {
    "path": "apps/showcase/lib/theme.ts",
    "content": "import { DarkTheme, DefaultTheme, type Theme } from '@react-navigation/native';\n\nexport const THEME = {\n  light: {\n    background: 'hsl(0 0% 100%)',\n    foreground: 'hsl(0 0% 3.9%)',\n    card: 'hsl(0 0% 100%)',\n    cardForeground: 'hsl(0 0% 3.9%)',\n    popover: 'hsl(0 0% 100%)',\n    popoverForeground: 'hsl(0 0% 3.9%)',\n    primary: 'hsl(0 0% 9%)',\n    primaryForeground: 'hsl(0 0% 98%)',\n    secondary: 'hsl(0 0% 96.1%)',\n    secondaryForeground: 'hsl(0 0% 9%)',\n    muted: 'hsl(0 0% 96.1%)',\n    mutedForeground: 'hsl(0 0% 45.1%)',\n    accent: 'hsl(0 0% 96.1%)',\n    accentForeground: 'hsl(0 0% 9%)',\n    destructive: 'hsl(0 84.2% 60.2%)',\n    border: 'hsl(0 0% 89.8%)',\n    input: 'hsl(0 0% 89.8%)',\n    ring: 'hsl(0 0% 63%)',\n    radius: '0.625rem',\n    chart1: 'hsl(12 76% 61%)',\n    chart2: 'hsl(173 58% 39%)',\n    chart3: 'hsl(197 37% 24%)',\n    chart4: 'hsl(43 74% 66%)',\n    chart5: 'hsl(27 87% 67%)',\n  },\n  dark: {\n    background: 'hsl(0 0% 3.9%)',\n    foreground: 'hsl(0 0% 98%)',\n    card: 'hsl(0 0% 3.9%)',\n    cardForeground: 'hsl(0 0% 98%)',\n    popover: 'hsl(0 0% 3.9%)',\n    popoverForeground: 'hsl(0 0% 98%)',\n    primary: 'hsl(0 0% 98%)',\n    primaryForeground: 'hsl(0 0% 9%)',\n    secondary: 'hsl(0 0% 14.9%)',\n    secondaryForeground: 'hsl(0 0% 98%)',\n    muted: 'hsl(0 0% 14.9%)',\n    mutedForeground: 'hsl(0 0% 63.9%)',\n    accent: 'hsl(0 0% 14.9%)',\n    accentForeground: 'hsl(0 0% 98%)',\n    destructive: 'hsl(0 70.9% 59.4%)',\n    border: 'hsl(0 0% 14.9%)',\n    input: 'hsl(0 0% 14.9%)',\n    ring: 'hsl(300 0% 45%)',\n    radius: '0.625rem',\n    chart1: 'hsl(220 70% 50%)',\n    chart2: 'hsl(160 60% 45%)',\n    chart3: 'hsl(30 80% 55%)',\n    chart4: 'hsl(280 65% 60%)',\n    chart5: 'hsl(340 75% 55%)',\n  },\n};\n\nexport const NAV_THEME: Record<'light' | 'dark', Theme> = {\n  light: {\n    ...DefaultTheme,\n    colors: {\n      background: THEME.light.background,\n      border: THEME.light.border,\n      card: THEME.light.card,\n      notification: THEME.light.destructive,\n      primary: THEME.light.primary,\n      text: THEME.light.foreground,\n    },\n    fonts: {\n      bold: { fontFamily: 'Geist-Medium', fontWeight: '500' },\n      medium: { fontFamily: 'Geist-Medium', fontWeight: '500' },\n      regular: { fontFamily: 'Geist', fontWeight: '400' },\n      heavy: { fontFamily: 'Geist-SemiBold', fontWeight: '600' },\n    },\n  },\n  dark: {\n    ...DarkTheme,\n    colors: {\n      background: THEME.dark.background,\n      border: THEME.dark.border,\n      card: THEME.dark.card,\n      notification: THEME.dark.destructive,\n      primary: THEME.dark.primary,\n      text: THEME.dark.foreground,\n    },\n    fonts: {\n      bold: { fontFamily: 'Geist-Medium', fontWeight: '500' },\n      medium: { fontFamily: 'Geist-Medium', fontWeight: '500' },\n      regular: { fontFamily: 'Geist', fontWeight: '400' },\n      heavy: { fontFamily: 'Geist-SemiBold', fontWeight: '600' },\n    },\n  },\n};\n"
  },
  {
    "path": "apps/showcase/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/showcase/metro.config.js",
    "content": "const { getDefaultConfig } = require('expo/metro-config');\nconst { withNativeWind } = require('nativewind/metro');\nconst path = require('path');\n\n// Find the project and workspace directories\nconst projectRoot = __dirname;\n// This can be replaced with `find-yarn-workspace-root`\nconst monorepoRoot = path.resolve(projectRoot, '../..');\n\nconst config = getDefaultConfig(projectRoot);\n\n// 1. Watch all files within the monorepo\nconfig.watchFolders = [monorepoRoot];\n// 2. Let Metro know where to resolve packages and in what order\nconfig.resolver.nodeModulesPaths = [\n  path.resolve(projectRoot, 'node_modules'),\n  path.resolve(monorepoRoot, 'node_modules'),\n];\n\nconst { resolver } = config;\nconfig.resolver = {\n  ...resolver,\n  sourceExts: [...resolver.sourceExts, 'mjs', 'cjs'],\n};\n\nmodule.exports = withNativeWind(config, { input: './global.css', inlineRem: 16 });\n"
  },
  {
    "path": "apps/showcase/nativewind-env.d.ts",
    "content": "/// <reference types=\"nativewind/types\" />\n\n// NOTE: This file should not be edited and should be committed with your source code. It is generated by NativeWind.\n"
  },
  {
    "path": "apps/showcase/package.json",
    "content": "{\n  \"name\": \"@rnr/showcase\",\n  \"main\": \"index.js\",\n  \"version\": \"0.0.3\",\n  \"scripts\": {\n    \"start\": \"ENV=development expo start --clear\",\n    \"device:ios\": \"ENV=development expo run:ios --device\",\n    \"device:ios:prod\": \"expo run:ios --device\",\n    \"ios\": \"ENV=development expo run:ios\",\n    \"ios:prod\": \"expo run:ios\",\n    \"device:android\": \"ENV=development expo run:android --device\",\n    \"device:android:prod\": \"expo run:android --device\",\n    \"android\": \"ENV=development expo run:android\",\n    \"android:prod\": \"expo run:android\",\n    \"prebuild\": \"ENV=development expo prebuild --clean\",\n    \"prebuild:ios\": \"ENV=development expo prebuild --platform ios --clean\",\n    \"prebuild:android\": \"ENV=development expo prebuild --platform android --clean\",\n    \"prebuild:prod\": \"expo prebuild --clean\",\n    \"testflight\": \"eas build -p ios --submit\",\n    \"build:dev\": \"eas build --profile development\",\n    \"build:preview\": \"eas build --profile preview\",\n    \"build:prod\": \"eas build --profile production --auto-submit\",\n    \"update:ios\": \"eas update --platform ios\",\n    \"build:web\": \"npx expo export -p web\",\n    \"serve:web\": \"npx serve dist --single\",\n    \"clean\": \"rm -rf .expo node_modules\",\n    \"postinstall\": \"npx tailwindcss -i ./global.css -o ./node_modules/.cache/nativewind/global.css\"\n  },\n  \"dependencies\": {\n    \"@expo-google-fonts/geist\": \"^0.4.0\",\n    \"@react-navigation/native\": \"^7.0.0\",\n    \"@rn-primitives/aspect-ratio\": \"~1.2.0\",\n    \"@rn-primitives/collapsible\": \"~1.2.0\",\n    \"@rn-primitives/label\": \"~1.2.0\",\n    \"@rn-primitives/portal\": \"~1.3.0\",\n    \"@rn-primitives/slider\": \"~1.2.0\",\n    \"@rn-primitives/toast\": \"~1.2.0\",\n    \"@rn-primitives/toolbar\": \"~1.2.0\",\n    \"@rnr/registry\": \"workspace:*\",\n    \"@shopify/flash-list\": \"2.0.2\",\n    \"class-variance-authority\": \"^0.7.1\",\n    \"clsx\": \"^2.1.1\",\n    \"expo\": \"^55.0.6\",\n    \"expo-constants\": \"~55.0.7\",\n    \"expo-font\": \"~55.0.4\",\n    \"expo-haptics\": \"~55.0.8\",\n    \"expo-linking\": \"~55.0.7\",\n    \"expo-router\": \"~55.0.5\",\n    \"expo-splash-screen\": \"~55.0.10\",\n    \"expo-status-bar\": \"~55.0.4\",\n    \"expo-system-ui\": \"~55.0.9\",\n    \"expo-updates\": \"~55.0.13\",\n    \"lucide-react-native\": \"^0.577.0\",\n    \"nativewind\": \"^4.2.2\",\n    \"react\": \"19.2.0\",\n    \"react-dom\": \"19.2.0\",\n    \"react-native\": \"0.83.2\",\n    \"react-native-gesture-handler\": \"~2.30.0\",\n    \"react-native-keyboard-controller\": \"1.20.7\",\n    \"react-native-reanimated\": \"~4.2.1\",\n    \"react-native-safe-area-context\": \"5.6.2\",\n    \"react-native-screens\": \"^4.23.0\",\n    \"react-native-svg\": \"15.15.3\",\n    \"react-native-web\": \"~0.21.1\",\n    \"react-native-worklets\": \"0.7.2\",\n    \"tailwind-merge\": \"^3.5.0\",\n    \"tailwindcss-animate\": \"^1.0.7\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.26.0\",\n    \"@types/react\": \"~19.2.14\",\n    \"tailwindcss\": \"^3.4.14\",\n    \"typescript\": \"^5.9.3\"\n  },\n  \"private\": true\n}\n"
  },
  {
    "path": "apps/showcase/plugins/geistFontPlugin.js",
    "content": "const plugin = require('tailwindcss/plugin');\n\nmodule.exports = plugin(function ({ addUtilities }) {\n  addUtilities({\n    '.font-sans': {\n      fontFamily: 'Geist',\n    },\n  });\n\n  addUtilities({\n    '.font-thin': { fontFamily: 'Geist-Thin' },\n    '.font-extralight': { fontFamily: 'Geist-ExtraLight' },\n    '.font-light': { fontFamily: 'Geist-Light' },\n    '.font-normal': { fontFamily: 'Geist' },\n    '.font-medium': { fontFamily: 'Geist-Medium' },\n    '.font-semibold': { fontFamily: 'Geist-SemiBold' },\n    '.font-bold': { fontFamily: 'Geist-Bold' },\n    '.font-extrabold': { fontFamily: 'Geist-ExtraBold' },\n    '.font-black': { fontFamily: 'Geist-Black' },\n  });\n});\n"
  },
  {
    "path": "apps/showcase/tailwind.config.js",
    "content": "const { hairlineWidth } = require('nativewind/theme');\nconst geistFontPlugin = require('./plugins/geistFontPlugin.js');\nconst { platformSelect } = require('nativewind/theme');\n\n/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n  darkMode: 'class',\n  content: [\n    './app/**/*.{ts,tsx}',\n    './components/**/*.{ts,tsx}',\n    './node_modules/@rnr/**/*.{ts,tsx}',\n  ],\n  presets: [require('nativewind/preset')],\n  theme: {\n    extend: {\n      fontFamily: {\n        sans: ['Geist'],\n      },\n      colors: {\n        border: 'hsl(var(--border))',\n        input: 'hsl(var(--input))',\n        ring: 'hsl(var(--ring))',\n        background: 'hsl(var(--background))',\n        foreground: 'hsl(var(--foreground))',\n        primary: {\n          DEFAULT: 'hsl(var(--primary))',\n          foreground: 'hsl(var(--primary-foreground))',\n        },\n        secondary: {\n          DEFAULT: 'hsl(var(--secondary))',\n          foreground: 'hsl(var(--secondary-foreground))',\n        },\n        destructive: {\n          DEFAULT: 'hsl(var(--destructive))',\n          foreground: 'hsl(var(--destructive-foreground))',\n        },\n        muted: {\n          DEFAULT: 'hsl(var(--muted))',\n          foreground: 'hsl(var(--muted-foreground))',\n        },\n        accent: {\n          DEFAULT: 'hsl(var(--accent))',\n          foreground: 'hsl(var(--accent-foreground))',\n        },\n        popover: {\n          DEFAULT: 'hsl(var(--popover))',\n          foreground: 'hsl(var(--popover-foreground))',\n        },\n        card: {\n          DEFAULT: 'hsl(var(--card))',\n          foreground: 'hsl(var(--card-foreground))',\n        },\n      },\n      borderRadius: {\n        lg: 'var(--radius)',\n        md: 'calc(var(--radius) - 2px)',\n        sm: 'calc(var(--radius) - 4px)',\n      },\n      borderWidth: {\n        hairline: hairlineWidth(),\n      },\n      keyframes: {\n        'accordion-down': {\n          from: { height: '0' },\n          to: { height: 'var(--radix-accordion-content-height)' },\n        },\n        'accordion-up': {\n          from: { height: 'var(--radix-accordion-content-height)' },\n          to: { height: '0' },\n        },\n      },\n      animation: {\n        'accordion-down': 'accordion-down 0.2s ease-out',\n        'accordion-up': 'accordion-up 0.2s ease-out',\n      },\n    },\n  },\n  future: {\n    hoverOnlyWhenSupported: true,\n  },\n  plugins: [\n    platformSelect({ native: geistFontPlugin, default: [] }),\n    require('tailwindcss-animate'),\n  ],\n};\n"
  },
  {
    "path": "apps/showcase/tsconfig.json",
    "content": "{\n  \"extends\": \"expo/tsconfig.base\",\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"paths\": {\n      \"@showcase/*\": [\n        \"./*\"\n      ],\n      \"@/registry/*\": [\n        \"../../packages/registry/src/*\"\n      ]\n    },\n    \"jsx\": \"react-native\",\n    \"types\": [\n      \"nativewind/types\"\n    ],\n    \"target\": \"ES2022\",\n    \"lib\": [\n      \"dom\",\n      \"dom.iterable\",\n      \"ES2022\"\n    ],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"Bundler\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"moduleDetection\": \"force\",\n    \"incremental\": true,\n    \"noUncheckedIndexedAccess\": true\n  },\n  \"include\": [\n    \"index.js\",\n    \"**/*.ts\",\n    \"**/*.tsx\",\n    \".expo/types/**/*.ts\",\n    \"expo-env.d.ts\",\n    \"nativewind-env.d.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\",\n    \"build\",\n    \"dist\",\n    \".expo\"\n  ]\n}"
  },
  {
    "path": "apps/showcase/vercel.json",
    "content": "{\n  \"outputDirectory\": \"dist\",\n  \"devCommand\": \"expo\",\n  \"cleanUrls\": true,\n  \"framework\": null,\n  \"rewrites\": [\n    {\n      \"source\": \"/:path*\",\n      \"destination\": \"/\"\n    }\n  ]\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"@rnr/monorepo\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"turbo dev\",\n    \"dev:docs\": \"turbo dev --filter=docs\",\n    \"dev:showcase\": \"turbo dev --filter=showcase --concurrency 32\",\n    \"dev:showcase:android\": \"turbo dev:android --filter=showcase --concurrency 32\",\n    \"dev:showcase:web\": \"turbo dev:web --filter=showcase --concurrency 32\",\n    \"lint\": \"turbo lint\",\n    \"test\": \"turbo test\",\n    \"build\": \"turbo build\",\n    \"build:showcase\": \"turbo build --filter=showcase\",\n    \"build:docs\": \"turbo build --filter=docs\",\n    \"clean\": \"turbo clean && rm -rf .turbo node_modules\"\n  },\n  \"devDependencies\": {\n    \"prettier\": \"^3.6.2\",\n    \"prettier-plugin-tailwindcss\": \"^0.6.14\",\n    \"turbo\": \"^1.12.4\",\n    \"typescript\": \"^5.9.3\"\n  },\n  \"pnpm\": {\n    \"peerDependencyRules\": {\n      \"ignoreMissing\": [\n        \"@babel/*\",\n        \"expo-modules-*\",\n        \"typescript\"\n      ]\n    }\n  },\n  \"engines\": {\n    \"node\": \">=20.11.0\"\n  },\n  \"packageManager\": \"pnpm@9.1.4\",\n  \"resolutions\": {\n    \"lightningcss\": \"1.27.0\"\n  }\n}\n"
  },
  {
    "path": "packages/registry/nativewind-env.d.ts",
    "content": "/// <reference types=\"nativewind/types\" />\n"
  },
  {
    "path": "packages/registry/package.json",
    "content": "{\n  \"name\": \"@rnr/registry\",\n  \"description\": \"React Native Reusables Registry\",\n  \"license\": \"MIT\",\n  \"private\": true,\n  \"scripts\": {\n    \"clean\": \"rm -rf node_modules\"\n  },\n  \"type\": \"module\",\n  \"version\": \"0.0.0\",\n  \"imports\": {\n    \"@/*\": [\n      \"./src/*.ts\",\n      \"./src/*.tsx\"\n    ]\n  },\n  \"dependencies\": {\n    \"@clerk/clerk-expo\": \"^2.19.31\",\n    \"@rn-primitives/accordion\": \"~1.2.0\",\n    \"@rn-primitives/alert-dialog\": \"~1.2.0\",\n    \"@rn-primitives/aspect-ratio\": \"~1.2.0\",\n    \"@rn-primitives/avatar\": \"~1.2.0\",\n    \"@rn-primitives/checkbox\": \"~1.2.0\",\n    \"@rn-primitives/collapsible\": \"~1.2.0\",\n    \"@rn-primitives/context-menu\": \"~1.2.0\",\n    \"@rn-primitives/dialog\": \"~1.2.0\",\n    \"@rn-primitives/dropdown-menu\": \"~1.2.0\",\n    \"@rn-primitives/hover-card\": \"~1.2.0\",\n    \"@rn-primitives/label\": \"~1.2.0\",\n    \"@rn-primitives/menubar\": \"~1.2.0\",\n    \"@rn-primitives/navigation-menu\": \"~1.2.0\",\n    \"@rn-primitives/popover\": \"~1.2.0\",\n    \"@rn-primitives/portal\": \"~1.3.0\",\n    \"@rn-primitives/progress\": \"~1.2.0\",\n    \"@rn-primitives/radio-group\": \"~1.2.0\",\n    \"@rn-primitives/select\": \"~1.2.0\",\n    \"@rn-primitives/separator\": \"~1.2.0\",\n    \"@rn-primitives/slider\": \"~1.2.0\",\n    \"@rn-primitives/slot\": \"~1.2.0\",\n    \"@rn-primitives/switch\": \"~1.2.0\",\n    \"@rn-primitives/table\": \"~1.2.0\",\n    \"@rn-primitives/tabs\": \"~1.2.0\",\n    \"@rn-primitives/toast\": \"~1.2.0\",\n    \"@rn-primitives/toggle\": \"~1.2.0\",\n    \"@rn-primitives/toggle-group\": \"~1.2.0\",\n    \"@rn-primitives/toolbar\": \"~1.2.0\",\n    \"@rn-primitives/tooltip\": \"~1.2.0\",\n    \"class-variance-authority\": \"^0.7.1\",\n    \"clsx\": \"^2.1.1\",\n    \"expo-auth-session\": \"~55.0.8\",\n    \"expo-constants\": \"~55.0.7\",\n    \"expo-crypto\": \"~55.0.9\",\n    \"expo-linking\": \"~55.0.7\",\n    \"expo-router\": \"~55.0.5\",\n    \"lucide-react-native\": \"^0.577.0\",\n    \"nativewind\": \"^4.2.2\",\n    \"react-native-reanimated\": \"~4.2.1\",\n    \"react-native-safe-area-context\": \"5.6.2\",\n    \"react-native-screens\": \"^4.23.0\",\n    \"react-native-svg\": \"15.15.3\",\n    \"react-native-worklets\": \"0.7.2\",\n    \"tailwind-merge\": \"^3.5.0\",\n    \"uniwind\": \"^1.5.0\"\n  },\n  \"devDependencies\": {\n    \"@tsconfig/recommended\": \"^1.0.1\",\n    \"@types/react\": \"~19.2.14\",\n    \"react\": \"19.2.0\",\n    \"react-native\": \"0.83.2\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"*\",\n    \"react-native\": \"*\",\n    \"react-native-web\": \"*\"\n  },\n  \"peerDependenciesMeta\": {\n    \"react-native\": {\n      \"optional\": true\n    },\n    \"react-native-web\": {\n      \"optional\": true\n    }\n  }\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/clerk/forgot-password-form.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from '@/registry/nativewind/components/ui/card';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { useSignIn } from '@clerk/clerk-expo';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport function ForgotPasswordForm() {\n  const [email, setEmail] = React.useState('');\n  const { signIn, isLoaded } = useSignIn();\n  const [error, setError] = React.useState<{ email?: string; password?: string }>({});\n\n  const onSubmit = async () => {\n    if (!email) {\n      setError({ email: 'Email is required' });\n      return;\n    }\n    if (!isLoaded) {\n      return;\n    }\n\n    try {\n      await signIn.create({\n        strategy: 'reset_password_email_code',\n        identifier: email,\n      });\n\n      // TODO: Navigate to reset password screen\n    } catch (err) {\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\n      if (err instanceof Error) {\n        setError({ email: err.message });\n        return;\n      }\n      console.error(JSON.stringify(err, null, 2));\n    }\n  };\n\n  return (\n    <View className=\"gap-6\">\n      <Card className=\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\">\n        <CardHeader>\n          <CardTitle className=\"text-center text-xl sm:text-left\">Forgot password?</CardTitle>\n          <CardDescription className=\"text-center sm:text-left\">\n            Enter your email to reset your password\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"gap-6\">\n          <View className=\"gap-6\">\n            <View className=\"gap-1.5\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input\n                id=\"email\"\n                defaultValue={email}\n                placeholder=\"m@example.com\"\n                keyboardType=\"email-address\"\n                autoComplete=\"email\"\n                autoCapitalize=\"none\"\n                onChangeText={setEmail}\n                onSubmitEditing={onSubmit}\n                returnKeyType=\"send\"\n              />\n              {error.email ? (\n                <Text className=\"text-destructive text-sm font-medium\">{error.email}</Text>\n              ) : null}\n            </View>\n            <Button className=\"w-full\" onPress={onSubmit}>\n              <Text>Reset your password</Text>\n            </Button>\n          </View>\n        </CardContent>\n      </Card>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/clerk/reset-password-form.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from '@/registry/nativewind/components/ui/card';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { useSignIn } from '@clerk/clerk-expo';\nimport * as React from 'react';\nimport { TextInput, View } from 'react-native';\n\nexport function ResetPasswordForm() {\n  const { signIn, setActive, isLoaded } = useSignIn();\n  const [password, setPassword] = React.useState('');\n  const [code, setCode] = React.useState('');\n  const codeInputRef = React.useRef<TextInput>(null);\n  const [error, setError] = React.useState({ code: '', password: '' });\n\n  async function onSubmit() {\n    if (!isLoaded) {\n      return;\n    }\n    try {\n      const result = await signIn?.attemptFirstFactor({\n        strategy: 'reset_password_email_code',\n        code,\n        password,\n      });\n\n      if (result.status === 'complete') {\n        // Set the active session to\n        // the newly created session (user is now signed in)\n        setActive({ session: result.createdSessionId });\n        // TODO: If your app does not use `Stack.Protected`, navigate to your protected screen\n        return;\n      }\n      // TODO: Handle other statuses\n    } catch (err) {\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\n      if (err instanceof Error) {\n        const isPasswordMessage = err.message.toLowerCase().includes('password');\n        setError({ code: '', password: isPasswordMessage ? err.message : '' });\n        return;\n      }\n      console.error(JSON.stringify(err, null, 2));\n    }\n  }\n\n  function onPasswordSubmitEditing() {\n    codeInputRef.current?.focus();\n  }\n\n  return (\n    <View className=\"gap-6\">\n      <Card className=\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\">\n        <CardHeader>\n          <CardTitle className=\"text-center text-xl sm:text-left\">Reset password</CardTitle>\n          <CardDescription className=\"text-center sm:text-left\">\n            Enter the code sent to your email and set a new password\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"gap-6\">\n          <View className=\"gap-6\">\n            <View className=\"gap-1.5\">\n              <View className=\"flex-row items-center\">\n                <Label htmlFor=\"password\">New password</Label>\n              </View>\n              <Input\n                id=\"password\"\n                secureTextEntry\n                onChangeText={setPassword}\n                returnKeyType=\"next\"\n                submitBehavior=\"submit\"\n                onSubmitEditing={onPasswordSubmitEditing}\n              />\n              {error.password ? (\n                <Text className=\"text-destructive text-sm font-medium\">{error.password}</Text>\n              ) : null}\n            </View>\n            <View className=\"gap-1.5\">\n              <Label htmlFor=\"code\">Verification code</Label>\n              <Input\n                id=\"code\"\n                autoCapitalize=\"none\"\n                onChangeText={setCode}\n                returnKeyType=\"send\"\n                keyboardType=\"numeric\"\n                autoComplete=\"sms-otp\"\n                textContentType=\"oneTimeCode\"\n                onSubmitEditing={onSubmit}\n              />\n              {error.code ? (\n                <Text className=\"text-destructive text-sm font-medium\">{error.code}</Text>\n              ) : null}\n            </View>\n            <Button className=\"w-full\" onPress={onSubmit}>\n              <Text>Reset Password</Text>\n            </Button>\n          </View>\n        </CardContent>\n      </Card>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/clerk/sign-in-form.tsx",
    "content": "import { SocialConnections } from '@/registry/blocks/social-connections';\nimport { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from '@/registry/nativewind/components/ui/card';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Separator } from '@/registry/nativewind/components/ui/separator';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { useSignIn } from '@clerk/clerk-expo';\nimport * as React from 'react';\nimport { Pressable, type TextInput, View } from 'react-native';\n\nexport function SignInForm() {\n  const { signIn, setActive, isLoaded } = useSignIn();\n  const [email, setEmail] = React.useState('');\n  const [password, setPassword] = React.useState('');\n  const passwordInputRef = React.useRef<TextInput>(null);\n  const [error, setError] = React.useState<{ email?: string; password?: string }>({});\n\n  async function onSubmit() {\n    if (!isLoaded) {\n      return;\n    }\n\n    // Start the sign-in process using the email and password provided\n    try {\n      const signInAttempt = await signIn.create({\n        identifier: email,\n        password,\n      });\n\n      // If sign-in process is complete, set the created session as active\n      // and redirect the user\n      if (signInAttempt.status === 'complete') {\n        setError({ email: '', password: '' });\n        await setActive({ session: signInAttempt.createdSessionId });\n        // TODO: If your app does not use `Stack.Protected`, navigate to your protected screen\n        return;\n      }\n      // TODO: Handle other statuses\n      console.error(JSON.stringify(signInAttempt, null, 2));\n    } catch (err) {\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\n      if (err instanceof Error) {\n        const isEmailMessage =\n          err.message.toLowerCase().includes('identifier') ||\n          err.message.toLowerCase().includes('email');\n        setError(isEmailMessage ? { email: err.message } : { password: err.message });\n        return;\n      }\n      console.error(JSON.stringify(err, null, 2));\n    }\n  }\n\n  function onEmailSubmitEditing() {\n    passwordInputRef.current?.focus();\n  }\n\n  return (\n    <View className=\"gap-6\">\n      <Card className=\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\">\n        <CardHeader>\n          <CardTitle className=\"text-center text-xl sm:text-left\">Sign in to your app</CardTitle>\n          <CardDescription className=\"text-center sm:text-left\">\n            Welcome back! Please sign in to continue\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"gap-6\">\n          <View className=\"gap-6\">\n            <View className=\"gap-1.5\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input\n                id=\"email\"\n                placeholder=\"m@example.com\"\n                keyboardType=\"email-address\"\n                autoComplete=\"email\"\n                autoCapitalize=\"none\"\n                onChangeText={setEmail}\n                onSubmitEditing={onEmailSubmitEditing}\n                returnKeyType=\"next\"\n                submitBehavior=\"submit\"\n              />\n              {error.email ? (\n                <Text className=\"text-destructive text-sm font-medium\">{error.email}</Text>\n              ) : null}\n            </View>\n            <View className=\"gap-1.5\">\n              <View className=\"flex-row items-center\">\n                <Label htmlFor=\"password\">Password</Label>\n                <Button\n                  variant=\"link\"\n                  size=\"sm\"\n                  className=\"web:h-fit ml-auto h-4 px-1 py-0 sm:h-4\"\n                  onPress={() => {\n                    // TODO: Navigate to forgot password screen\n                  }}>\n                  <Text className=\"font-normal leading-4\">Forgot your password?</Text>\n                </Button>\n              </View>\n              <Input\n                ref={passwordInputRef}\n                id=\"password\"\n                secureTextEntry\n                onChangeText={setPassword}\n                returnKeyType=\"send\"\n                onSubmitEditing={onSubmit}\n              />\n              {error.password ? (\n                <Text className=\"text-destructive text-sm font-medium\">{error.password}</Text>\n              ) : null}\n            </View>\n            <Button className=\"w-full\" onPress={onSubmit}>\n              <Text>Continue</Text>\n            </Button>\n          </View>\n          <Text className=\"text-center text-sm\">\n            Don&apos;t have an account?{' '}\n            <Pressable\n              onPress={() => {\n                // TODO: Navigate to sign up screen\n              }}>\n              <Text className=\"text-sm underline underline-offset-4\">Sign up</Text>\n            </Pressable>\n          </Text>\n          <View className=\"flex-row items-center\">\n            <Separator className=\"flex-1\" />\n            <Text className=\"text-muted-foreground px-4 text-sm\">or</Text>\n            <Separator className=\"flex-1\" />\n          </View>\n          <SocialConnections />\n        </CardContent>\n      </Card>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/clerk/sign-up-form.tsx",
    "content": "import { SocialConnections } from '@/registry/blocks/social-connections';\nimport { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from '@/registry/nativewind/components/ui/card';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Separator } from '@/registry/nativewind/components/ui/separator';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { useSignUp } from '@clerk/clerk-expo';\nimport * as React from 'react';\nimport { Pressable, TextInput, View } from 'react-native';\n\nexport function SignUpForm() {\n  const { signUp, isLoaded } = useSignUp();\n  const [email, setEmail] = React.useState('');\n  const [password, setPassword] = React.useState('');\n  const passwordInputRef = React.useRef<TextInput>(null);\n  const [error, setError] = React.useState<{ email?: string; password?: string }>({});\n\n  async function onSubmit() {\n    if (!isLoaded) return;\n\n    // Start sign-up process using email and password provided\n    try {\n      await signUp.create({\n        emailAddress: email,\n        password,\n      });\n\n      // Send user an email with verification code\n      await signUp.prepareEmailAddressVerification({ strategy: 'email_code' });\n\n      // TODO: Navigate to verify email screen to capture OTP code\n    } catch (err) {\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\n      if (err instanceof Error) {\n        const isEmailMessage =\n          err.message.toLowerCase().includes('identifier') ||\n          err.message.toLowerCase().includes('email');\n        setError(isEmailMessage ? { email: err.message } : { password: err.message });\n        return;\n      }\n      console.error(JSON.stringify(err, null, 2));\n    }\n  }\n\n  function onEmailSubmitEditing() {\n    passwordInputRef.current?.focus();\n  }\n\n  return (\n    <View className=\"gap-6\">\n      <Card className=\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\">\n        <CardHeader>\n          <CardTitle className=\"text-center text-xl sm:text-left\">Create your account</CardTitle>\n          <CardDescription className=\"text-center sm:text-left\">\n            Welcome! Please fill in the details to get started.\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"gap-6\">\n          <View className=\"gap-6\">\n            <View className=\"gap-1.5\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input\n                id=\"email\"\n                placeholder=\"m@example.com\"\n                keyboardType=\"email-address\"\n                autoComplete=\"email\"\n                autoCapitalize=\"none\"\n                onChangeText={setEmail}\n                onSubmitEditing={onEmailSubmitEditing}\n                returnKeyType=\"next\"\n                submitBehavior=\"submit\"\n              />\n              {error.email ? (\n                <Text className=\"text-destructive text-sm font-medium\">{error.email}</Text>\n              ) : null}\n            </View>\n            <View className=\"gap-1.5\">\n              <View className=\"flex-row items-center\">\n                <Label htmlFor=\"password\">Password</Label>\n              </View>\n              <Input\n                ref={passwordInputRef}\n                id=\"password\"\n                secureTextEntry\n                onChangeText={setPassword}\n                returnKeyType=\"send\"\n                onSubmitEditing={onSubmit}\n              />\n              {error.password ? (\n                <Text className=\"text-destructive text-sm font-medium\">{error.password}</Text>\n              ) : null}\n            </View>\n            <Button className=\"w-full\" onPress={onSubmit}>\n              <Text>Continue</Text>\n            </Button>\n          </View>\n          <Text className=\"text-center text-sm\">\n            Already have an account?{' '}\n            <Pressable\n              onPress={() => {\n                // TODO: Navigate to sign in screen\n              }}>\n              <Text className=\"text-sm underline underline-offset-4\">Sign in</Text>\n            </Pressable>\n          </Text>\n          <View className=\"flex-row items-center\">\n            <Separator className=\"flex-1\" />\n            <Text className=\"text-muted-foreground px-4 text-sm\">or</Text>\n            <Separator className=\"flex-1\" />\n          </View>\n          <SocialConnections />\n        </CardContent>\n      </Card>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/clerk/social-connections.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport { Button } from '@/registry/nativewind/components/ui/button';\nimport { useSSO, type StartSSOFlowParams } from '@clerk/clerk-expo';\nimport * as AuthSession from 'expo-auth-session';\nimport * as WebBrowser from 'expo-web-browser';\nimport { useColorScheme } from 'nativewind';\nimport * as React from 'react';\nimport { Image, Platform, View, type ImageSourcePropType } from 'react-native';\n\nWebBrowser.maybeCompleteAuthSession();\n\ntype SocialConnectionStrategy = Extract<\n  StartSSOFlowParams['strategy'],\n  'oauth_google' | 'oauth_github' | 'oauth_apple'\n>;\n\nconst SOCIAL_CONNECTION_STRATEGIES: {\n  type: SocialConnectionStrategy;\n  source: ImageSourcePropType;\n  useTint?: boolean;\n}[] = [\n  {\n    type: 'oauth_apple',\n    source: { uri: 'https://img.clerk.com/static/apple.png?width=160' },\n    useTint: true,\n  },\n  {\n    type: 'oauth_google',\n    source: { uri: 'https://img.clerk.com/static/google.png?width=160' },\n    useTint: false,\n  },\n  {\n    type: 'oauth_github',\n    source: { uri: 'https://img.clerk.com/static/github.png?width=160' },\n    useTint: true,\n  },\n];\n\nexport function SocialConnections() {\n  useWarmUpBrowser();\n  const { colorScheme } = useColorScheme();\n  const { startSSOFlow } = useSSO();\n\n  function onSocialLoginPress(strategy: SocialConnectionStrategy) {\n    return async () => {\n      try {\n        // Start the authentication process by calling `startSSOFlow()`\n        const { createdSessionId, setActive, signIn } = await startSSOFlow({\n          strategy,\n          // For web, defaults to current path\n          // For native, you must pass a scheme, like AuthSession.makeRedirectUri({ scheme, path })\n          // For more info, see https://docs.expo.dev/versions/latest/sdk/auth-session/#authsessionmakeredirecturioptions\n          redirectUrl: AuthSession.makeRedirectUri(),\n        });\n\n        // If sign in was successful, set the active session\n        if (createdSessionId && setActive) {\n          setActive({ session: createdSessionId });\n          // TODO: If your app does not use `Stack.Protected`, redirect authenticated users to your protected screen\n          return;\n        }\n\n        // TODO: Handle other statuses\n        // If there is no `createdSessionId`,\n        // there are missing requirements, such as MFA\n        // Use the `signIn` or `signUp` returned from `startSSOFlow`\n        // to handle next steps\n      } catch (err) {\n        // See https://go.clerk.com/mRUDrIe for more info on error handling\n        console.error(JSON.stringify(err, null, 2));\n      }\n    };\n  }\n\n  return (\n    <View className=\"gap-2 sm:flex-row sm:gap-3\">\n      {SOCIAL_CONNECTION_STRATEGIES.map((strategy) => {\n        return (\n          <Button\n            key={strategy.type}\n            variant=\"outline\"\n            size=\"sm\"\n            className=\"sm:flex-1\"\n            onPress={onSocialLoginPress(strategy.type)}>\n            <Image\n              className={cn('size-4', strategy.useTint && Platform.select({ web: 'dark:invert' }))}\n              tintColor={Platform.select({\n                native: strategy.useTint ? (colorScheme === 'dark' ? 'white' : 'black') : undefined,\n              })}\n              source={strategy.source}\n            />\n          </Button>\n        );\n      })}\n    </View>\n  );\n}\n\nconst useWarmUpBrowser = Platform.select({\n  web: () => {},\n  default: () => {\n    React.useEffect(() => {\n      // Preloads the browser for Android devices to reduce authentication load time\n      // See: https://docs.expo.dev/guides/authentication/#improving-user-experience\n      void WebBrowser.warmUpAsync();\n      return () => {\n        // Cleanup: closes browser when component unmounts\n        void WebBrowser.coolDownAsync();\n      };\n    }, []);\n  },\n});\n"
  },
  {
    "path": "packages/registry/src/blocks/clerk/user-menu.tsx",
    "content": "import { Avatar, AvatarFallback, AvatarImage } from '@/registry/nativewind/components/ui/avatar';\nimport { Button } from '@/registry/nativewind/components/ui/button';\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\nimport {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from '@/registry/nativewind/components/ui/popover';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { useAuth, useUser } from '@clerk/clerk-expo';\nimport type { TriggerRef } from '@rn-primitives/popover';\nimport { LogOutIcon, PlusIcon, SettingsIcon } from 'lucide-react-native';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport function UserMenu() {\n  const { user } = useUser();\n  const { signOut } = useAuth();\n  const popoverTriggerRef = React.useRef<TriggerRef>(null);\n\n  async function onSignOut() {\n    popoverTriggerRef.current?.close();\n    await signOut();\n    // TODO: If your app does not use `Stack.Protected`, navigate to your sign-in screen\n  }\n\n  return (\n    <Popover>\n      <PopoverTrigger asChild ref={popoverTriggerRef}>\n        <Button variant=\"ghost\" size=\"icon\" className=\"size-8 rounded-full\">\n          <UserAvatar />\n        </Button>\n      </PopoverTrigger>\n      <PopoverContent align=\"end\" side=\"bottom\" className=\"w-80 p-0\">\n        <View className=\"border-border gap-3 border-b p-3\">\n          <View className=\"flex-row items-center gap-3\">\n            <UserAvatar className=\"size-10\" />\n            <View className=\"flex-1\">\n              <Text className=\"font-medium leading-5\">\n                {user?.fullName || user?.emailAddresses[0]?.emailAddress}\n              </Text>\n              {user?.fullName?.length ? (\n                <Text className=\"text-muted-foreground text-sm font-normal leading-4\">\n                  {user?.username || user?.emailAddresses[0]?.emailAddress}\n                </Text>\n              ) : null}\n            </View>\n          </View>\n          <View className=\"flex-row flex-wrap gap-3 py-0.5\">\n            <Button\n              variant=\"outline\"\n              size=\"sm\"\n              onPress={() => {\n                // TODO: Navigate to account settings screen\n              }}>\n              <Icon as={SettingsIcon} className=\"size-4\" />\n              <Text>Manage Account</Text>\n            </Button>\n            <Button variant=\"outline\" size=\"sm\" className=\"flex-1\" onPress={onSignOut}>\n              <Icon as={LogOutIcon} className=\"size-4\" />\n              <Text>Sign Out</Text>\n            </Button>\n          </View>\n        </View>\n        <Button\n          variant=\"ghost\"\n          size=\"lg\"\n          className=\"h-16 justify-start gap-3 rounded-none rounded-b-md px-3 sm:h-14\"\n          onPress={() => {\n            // TODO: Navigate to add account screen\n          }}>\n          <View className=\"size-10 items-center justify-center\">\n            <View className=\"border-border bg-muted/50 size-7 items-center justify-center rounded-full border border-dashed\">\n              <Icon as={PlusIcon} className=\"size-5\" />\n            </View>\n          </View>\n          <Text>Add account</Text>\n        </Button>\n      </PopoverContent>\n    </Popover>\n  );\n}\n\nfunction UserAvatar(props: Omit<React.ComponentProps<typeof Avatar>, 'alt'>) {\n  const { user } = useUser();\n\n  const { initials, imageSource, userName } = React.useMemo(() => {\n    const userName = user?.fullName || user?.emailAddresses[0]?.emailAddress || 'Unknown';\n    const initials = userName\n      .split(' ')\n      .map((name) => name[0])\n      .join('');\n\n    const imageSource = user?.imageUrl ? { uri: user.imageUrl } : undefined;\n    return { initials, imageSource, userName };\n  }, [user?.imageUrl, user?.fullName, user?.emailAddresses[0]?.emailAddress]);\n\n  return (\n    <Avatar alt={`${userName}'s avatar`} {...props}>\n      <AvatarImage source={imageSource} />\n      <AvatarFallback>\n        <Text>{initials}</Text>\n      </AvatarFallback>\n    </Avatar>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/clerk/verify-email-form.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from '@/registry/nativewind/components/ui/card';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { useSignUp } from '@clerk/clerk-expo';\nimport * as React from 'react';\nimport { type TextStyle, View } from 'react-native';\n\nconst RESEND_CODE_INTERVAL_SECONDS = 30;\n\nconst TABULAR_NUMBERS_STYLE: TextStyle = { fontVariant: ['tabular-nums'] };\n\nexport function VerifyEmailForm() {\n  const { signUp, setActive, isLoaded } = useSignUp();\n  const [code, setCode] = React.useState('');\n  const [error, setError] = React.useState('');\n  const { countdown, restartCountdown } = useCountdown(RESEND_CODE_INTERVAL_SECONDS);\n\n  async function onSubmit() {\n    if (!isLoaded) return;\n\n    try {\n      // Use the code the user provided to attempt verification\n      const signUpAttempt = await signUp.attemptEmailAddressVerification({\n        code,\n      });\n\n      // If verification was completed, set the session to active\n      // and redirect the user\n      if (signUpAttempt.status === 'complete') {\n        await setActive({ session: signUpAttempt.createdSessionId });\n        // TODO: Redirect authenticated users to your protected screen\n        return;\n      }\n      // TODO: Handle other statuses\n      // If the status is not complete, check why. User may need to\n      // complete further steps.\n      console.error(JSON.stringify(signUpAttempt, null, 2));\n    } catch (err) {\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\n      if (err instanceof Error) {\n        setError(err.message);\n        return;\n      }\n      console.error(JSON.stringify(err, null, 2));\n    }\n  }\n\n  async function onResendCode() {\n    if (!isLoaded) return;\n\n    try {\n      await signUp.prepareEmailAddressVerification({ strategy: 'email_code' });\n      restartCountdown();\n    } catch (err) {\n      // See https://go.clerk.com/mRUDrIe for more info on error handling\n      if (err instanceof Error) {\n        setError(err.message);\n        return;\n      }\n      console.error(JSON.stringify(err, null, 2));\n    }\n  }\n\n  return (\n    <View className=\"gap-6\">\n      <Card className=\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\">\n        <CardHeader>\n          <CardTitle className=\"text-center text-xl sm:text-left\">Verify your email</CardTitle>\n          <CardDescription className=\"text-center sm:text-left\">\n            Enter the verification code sent to m@example.com\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"gap-6\">\n          <View className=\"gap-6\">\n            <View className=\"gap-1.5\">\n              <Label htmlFor=\"code\">Verification code</Label>\n              <Input\n                id=\"code\"\n                autoCapitalize=\"none\"\n                onChangeText={setCode}\n                returnKeyType=\"send\"\n                keyboardType=\"numeric\"\n                autoComplete=\"sms-otp\"\n                textContentType=\"oneTimeCode\"\n                onSubmitEditing={onSubmit}\n              />\n              {!error ? null : (\n                <Text className=\"text-destructive text-sm font-medium\">{error}</Text>\n              )}\n              <Button variant=\"link\" size=\"sm\" disabled={countdown > 0} onPress={onResendCode}>\n                <Text className=\"text-center text-xs\">\n                  Didn&apos;t receive the code? Resend{' '}\n                  {countdown > 0 ? (\n                    <Text className=\"text-xs\" style={TABULAR_NUMBERS_STYLE}>\n                      ({countdown})\n                    </Text>\n                  ) : null}\n                </Text>\n              </Button>\n            </View>\n            <View className=\"gap-3\">\n              <Button className=\"w-full\" onPress={onSubmit}>\n                <Text>Continue</Text>\n              </Button>\n              <Button\n                variant=\"link\"\n                className=\"mx-auto\"\n                onPress={() => {\n                  // TODO: Navigate to sign up screen\n                }}>\n                <Text>Cancel</Text>\n              </Button>\n            </View>\n          </View>\n        </CardContent>\n      </Card>\n    </View>\n  );\n}\n\nfunction useCountdown(seconds = 30) {\n  const [countdown, setCountdown] = React.useState(seconds);\n  const intervalRef = React.useRef<ReturnType<typeof setInterval> | null>(null);\n\n  const startCountdown = React.useCallback(() => {\n    setCountdown(seconds);\n\n    if (intervalRef.current) {\n      clearInterval(intervalRef.current);\n    }\n\n    intervalRef.current = setInterval(() => {\n      setCountdown((prev) => {\n        if (prev <= 1) {\n          if (intervalRef.current) {\n            clearInterval(intervalRef.current);\n            intervalRef.current = null;\n          }\n          return 0;\n        }\n        return prev - 1;\n      });\n    }, 1000);\n  }, [seconds]);\n\n  React.useEffect(() => {\n    startCountdown();\n\n    return () => {\n      if (intervalRef.current) {\n        clearInterval(intervalRef.current);\n      }\n    };\n  }, [startCountdown]);\n\n  return { countdown, restartCountdown: startCountdown };\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/forgot-password-form.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from '@/registry/nativewind/components/ui/card';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { View } from 'react-native';\n\nexport function ForgotPasswordForm() {\n  function onSubmit() {\n    // TODO: Submit form and navigate to reset password screen if successful\n  }\n\n  return (\n    <View className=\"gap-6\">\n      <Card className=\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\">\n        <CardHeader>\n          <CardTitle className=\"text-center text-xl sm:text-left\">Forgot password?</CardTitle>\n          <CardDescription className=\"text-center sm:text-left\">\n            Enter your email to reset your password\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"gap-6\">\n          <View className=\"gap-6\">\n            <View className=\"gap-1.5\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input\n                id=\"email\"\n                placeholder=\"m@example.com\"\n                keyboardType=\"email-address\"\n                autoComplete=\"email\"\n                autoCapitalize=\"none\"\n                returnKeyType=\"send\"\n                onSubmitEditing={onSubmit}\n              />\n            </View>\n            <Button className=\"w-full\" onPress={onSubmit}>\n              <Text>Reset your password</Text>\n            </Button>\n          </View>\n        </CardContent>\n      </Card>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/index.ts",
    "content": "export * from './forgot-password-form';\nexport * from './reset-password-form';\nexport * from './sign-in-form';\nexport * from './sign-up-form';\nexport * from './social-connections';\nexport * from './user-menu';\nexport * from './verify-email-form';\n"
  },
  {
    "path": "packages/registry/src/blocks/reset-password-form.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from '@/registry/nativewind/components/ui/card';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport * as React from 'react';\nimport { TextInput, View } from 'react-native';\n\nexport function ResetPasswordForm() {\n  const codeInputRef = React.useRef<TextInput>(null);\n\n  function onPasswordSubmitEditing() {\n    codeInputRef.current?.focus();\n  }\n\n  function onSubmit() {\n    // TODO: Submit form and navigate to protected screen if successful\n  }\n\n  return (\n    <View className=\"gap-6\">\n      <Card className=\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\">\n        <CardHeader>\n          <CardTitle className=\"text-center text-xl sm:text-left\">Reset password</CardTitle>\n          <CardDescription className=\"text-center sm:text-left\">\n            Enter the code sent to your email and set a new password\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"gap-6\">\n          <View className=\"gap-6\">\n            <View className=\"gap-1.5\">\n              <View className=\"flex-row items-center\">\n                <Label htmlFor=\"password\">New password</Label>\n              </View>\n              <Input\n                id=\"password\"\n                secureTextEntry\n                returnKeyType=\"next\"\n                submitBehavior=\"submit\"\n                onSubmitEditing={onPasswordSubmitEditing}\n              />\n            </View>\n            <View className=\"gap-1.5\">\n              <Label htmlFor=\"code\">Verification code</Label>\n              <Input\n                id=\"code\"\n                autoCapitalize=\"none\"\n                returnKeyType=\"send\"\n                keyboardType=\"numeric\"\n                autoComplete=\"sms-otp\"\n                textContentType=\"oneTimeCode\"\n                onSubmitEditing={onSubmit}\n              />\n            </View>\n            <Button className=\"w-full\" onPress={onSubmit}>\n              <Text>Reset Password</Text>\n            </Button>\n          </View>\n        </CardContent>\n      </Card>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/sign-in-form.tsx",
    "content": "import { SocialConnections } from '@/registry/blocks/social-connections';\nimport { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from '@/registry/nativewind/components/ui/card';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Separator } from '@/registry/nativewind/components/ui/separator';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport * as React from 'react';\nimport { Pressable, type TextInput, View } from 'react-native';\n\nexport function SignInForm() {\n  const passwordInputRef = React.useRef<TextInput>(null);\n\n  function onEmailSubmitEditing() {\n    passwordInputRef.current?.focus();\n  }\n\n  function onSubmit() {\n    // TODO: Submit form and navigate to protected screen if successful\n  }\n\n  return (\n    <View className=\"gap-6\">\n      <Card className=\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\">\n        <CardHeader>\n          <CardTitle className=\"text-center text-xl sm:text-left\">Sign in to your app</CardTitle>\n          <CardDescription className=\"text-center sm:text-left\">\n            Welcome back! Please sign in to continue\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"gap-6\">\n          <View className=\"gap-6\">\n            <View className=\"gap-1.5\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input\n                id=\"email\"\n                placeholder=\"m@example.com\"\n                keyboardType=\"email-address\"\n                autoComplete=\"email\"\n                autoCapitalize=\"none\"\n                onSubmitEditing={onEmailSubmitEditing}\n                returnKeyType=\"next\"\n                submitBehavior=\"submit\"\n              />\n            </View>\n            <View className=\"gap-1.5\">\n              <View className=\"flex-row items-center\">\n                <Label htmlFor=\"password\">Password</Label>\n                <Button\n                  variant=\"link\"\n                  size=\"sm\"\n                  className=\"web:h-fit ml-auto h-4 px-1 py-0 sm:h-4\"\n                  onPress={() => {\n                    // TODO: Navigate to forgot password screen\n                  }}>\n                  <Text className=\"font-normal leading-4\">Forgot your password?</Text>\n                </Button>\n              </View>\n              <Input\n                ref={passwordInputRef}\n                id=\"password\"\n                secureTextEntry\n                returnKeyType=\"send\"\n                onSubmitEditing={onSubmit}\n              />\n            </View>\n            <Button className=\"w-full\" onPress={onSubmit}>\n              <Text>Continue</Text>\n            </Button>\n          </View>\n          <Text className=\"text-center text-sm\">\n            Don&apos;t have an account?{' '}\n            <Pressable\n              onPress={() => {\n                // TODO: Navigate to sign up screen\n              }}>\n              <Text className=\"text-sm underline underline-offset-4\">Sign up</Text>\n            </Pressable>\n          </Text>\n          <View className=\"flex-row items-center\">\n            <Separator className=\"flex-1\" />\n            <Text className=\"text-muted-foreground px-4 text-sm\">or</Text>\n            <Separator className=\"flex-1\" />\n          </View>\n          <SocialConnections />\n        </CardContent>\n      </Card>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/sign-up-form.tsx",
    "content": "import { SocialConnections } from '@/registry/blocks/social-connections';\nimport { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from '@/registry/nativewind/components/ui/card';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Separator } from '@/registry/nativewind/components/ui/separator';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport * as React from 'react';\nimport { Pressable, TextInput, View } from 'react-native';\n\nexport function SignUpForm() {\n  const passwordInputRef = React.useRef<TextInput>(null);\n\n  function onEmailSubmitEditing() {\n    passwordInputRef.current?.focus();\n  }\n\n  function onSubmit() {\n    // TODO: Submit form and navigate to protected screen if successful\n  }\n\n  return (\n    <View className=\"gap-6\">\n      <Card className=\"border-border/0 sm:border-border shadow-none sm:shadow-sm sm:shadow-black/5\">\n        <CardHeader>\n          <CardTitle className=\"text-center text-xl sm:text-left\">Create your account</CardTitle>\n          <CardDescription className=\"text-center sm:text-left\">\n            Welcome! Please fill in the details to get started.\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"gap-6\">\n          <View className=\"gap-6\">\n            <View className=\"gap-1.5\">\n              <Label htmlFor=\"email\">Email</Label>\n              <Input\n                id=\"email\"\n                placeholder=\"m@example.com\"\n                keyboardType=\"email-address\"\n                autoComplete=\"email\"\n                autoCapitalize=\"none\"\n                onSubmitEditing={onEmailSubmitEditing}\n                returnKeyType=\"next\"\n                submitBehavior=\"submit\"\n              />\n            </View>\n            <View className=\"gap-1.5\">\n              <View className=\"flex-row items-center\">\n                <Label htmlFor=\"password\">Password</Label>\n              </View>\n              <Input\n                ref={passwordInputRef}\n                id=\"password\"\n                secureTextEntry\n                returnKeyType=\"send\"\n                onSubmitEditing={onSubmit}\n              />\n            </View>\n            <Button className=\"w-full\" onPress={onSubmit}>\n              <Text>Continue</Text>\n            </Button>\n          </View>\n          <Text className=\"text-center text-sm\">\n            Already have an account?{' '}\n            <Pressable\n              onPress={() => {\n                // TODO: Navigate to sign in screen\n              }}>\n              <Text className=\"text-sm underline underline-offset-4\">Sign in</Text>\n            </Pressable>\n          </Text>\n          <View className=\"flex-row items-center\">\n            <Separator className=\"flex-1\" />\n            <Text className=\"text-muted-foreground px-4 text-sm\">or</Text>\n            <Separator className=\"flex-1\" />\n          </View>\n          <SocialConnections />\n        </CardContent>\n      </Card>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/social-connections.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport { Button } from '@/registry/nativewind/components/ui/button';\nimport { useColorScheme } from 'nativewind';\nimport { Image, Platform, View } from 'react-native';\n\nconst SOCIAL_CONNECTION_STRATEGIES = [\n  {\n    type: 'oauth_apple',\n    source: { uri: 'https://img.clerk.com/static/apple.png?width=160' },\n    useTint: true,\n  },\n  {\n    type: 'oauth_google',\n    source: { uri: 'https://img.clerk.com/static/google.png?width=160' },\n    useTint: false,\n  },\n  {\n    type: 'oauth_github',\n    source: { uri: 'https://img.clerk.com/static/github.png?width=160' },\n    useTint: true,\n  },\n];\n\nexport function SocialConnections() {\n  const { colorScheme } = useColorScheme();\n\n  return (\n    <View className=\"gap-2 sm:flex-row sm:gap-3\">\n      {SOCIAL_CONNECTION_STRATEGIES.map((strategy) => {\n        return (\n          <Button\n            key={strategy.type}\n            variant=\"outline\"\n            size=\"sm\"\n            className=\"sm:flex-1\"\n            onPress={() => {\n              // TODO: Authenticate with social provider and navigate to protected screen if successful\n            }}>\n            <Image\n              className={cn('size-4', strategy.useTint && Platform.select({ web: 'dark:invert' }))}\n              tintColor={Platform.select({\n                native: strategy.useTint ? (colorScheme === 'dark' ? 'white' : 'black') : undefined,\n              })}\n              source={strategy.source}\n            />\n          </Button>\n        );\n      })}\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/user-menu.tsx",
    "content": "import { Avatar, AvatarFallback, AvatarImage } from '@/registry/nativewind/components/ui/avatar';\nimport { Button } from '@/registry/nativewind/components/ui/button';\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\nimport {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from '@/registry/nativewind/components/ui/popover';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport type { TriggerRef } from '@rn-primitives/popover';\nimport { LogOutIcon, PlusIcon, SettingsIcon } from 'lucide-react-native';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nconst USER = {\n  fullName: 'Zach Nugent',\n  initials: 'ZN',\n  imgSrc: { uri: 'https://github.com/mrzachnugent.png' },\n  username: 'mrzachnugent',\n};\n\nexport function UserMenu() {\n  const popoverTriggerRef = React.useRef<TriggerRef>(null);\n\n  async function onSignOut() {\n    popoverTriggerRef.current?.close();\n    // TODO: Sign out and navigate to sign in screen\n  }\n\n  return (\n    <Popover>\n      <PopoverTrigger asChild ref={popoverTriggerRef}>\n        <Button variant=\"ghost\" size=\"icon\" className=\"size-8 rounded-full\">\n          <UserAvatar />\n        </Button>\n      </PopoverTrigger>\n      <PopoverContent align=\"center\" side=\"bottom\" className=\"w-80 p-0\">\n        <View className=\"border-border gap-3 border-b p-3\">\n          <View className=\"flex-row items-center gap-3\">\n            <UserAvatar className=\"size-10\" />\n            <View className=\"flex-1\">\n              <Text className=\"font-medium leading-5\">{USER.fullName}</Text>\n              {USER.fullName?.length ? (\n                <Text className=\"text-muted-foreground text-sm font-normal leading-4\">\n                  {USER.username}\n                </Text>\n              ) : null}\n            </View>\n          </View>\n          <View className=\"flex-row flex-wrap gap-3 py-0.5\">\n            <Button\n              variant=\"outline\"\n              size=\"sm\"\n              onPress={() => {\n                // TODO: Navigate to account settings screen\n              }}>\n              <Icon as={SettingsIcon} className=\"size-4\" />\n              <Text>Manage Account</Text>\n            </Button>\n            <Button variant=\"outline\" size=\"sm\" className=\"flex-1\" onPress={onSignOut}>\n              <Icon as={LogOutIcon} className=\"size-4\" />\n              <Text>Sign Out</Text>\n            </Button>\n          </View>\n        </View>\n        <Button\n          variant=\"ghost\"\n          size=\"lg\"\n          className=\"h-16 justify-start gap-3 rounded-none rounded-b-md px-3 sm:h-14\"\n          onPress={() => {\n            // TODO: Navigate to add account screen\n          }}>\n          <View className=\"size-10 items-center justify-center\">\n            <View className=\"border-border bg-muted/50 size-7 items-center justify-center rounded-full border border-dashed\">\n              <Icon as={PlusIcon} className=\"size-5\" />\n            </View>\n          </View>\n          <Text>Add account</Text>\n        </Button>\n      </PopoverContent>\n    </Popover>\n  );\n}\n\nfunction UserAvatar({ className, ...props }: Omit<React.ComponentProps<typeof Avatar>, 'alt'>) {\n  return (\n    <Avatar alt={`${USER.fullName}'s avatar`} className={cn('size-8', className)} {...props}>\n      <AvatarImage source={USER.imgSrc} />\n      <AvatarFallback>\n        <Text>{USER.initials}</Text>\n      </AvatarFallback>\n    </Avatar>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/blocks/verify-email-form.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from '@/registry/nativewind/components/ui/card';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport * as React from 'react';\nimport { type TextStyle, View } from 'react-native';\n\nconst RESEND_CODE_INTERVAL_SECONDS = 30;\n\nconst TABULAR_NUMBERS_STYLE: TextStyle = { fontVariant: ['tabular-nums'] };\n\nexport function VerifyEmailForm() {\n  const { countdown, restartCountdown } = useCountdown(RESEND_CODE_INTERVAL_SECONDS);\n\n  function onSubmit() {\n    // TODO: Submit form and navigate to protected screen if successful\n  }\n\n  return (\n    <View className=\"gap-6\">\n      <Card className=\"border-border/0 sm:border-border pb-4 shadow-none sm:shadow-sm sm:shadow-black/5\">\n        <CardHeader>\n          <CardTitle className=\"text-center text-xl sm:text-left\">Verify your email</CardTitle>\n          <CardDescription className=\"text-center sm:text-left\">\n            Enter the verification code sent to m@example.com\n          </CardDescription>\n        </CardHeader>\n        <CardContent className=\"gap-6\">\n          <View className=\"gap-6\">\n            <View className=\"gap-1.5\">\n              <Label htmlFor=\"code\">Verification code</Label>\n              <Input\n                id=\"code\"\n                autoCapitalize=\"none\"\n                returnKeyType=\"send\"\n                keyboardType=\"numeric\"\n                autoComplete=\"sms-otp\"\n                textContentType=\"oneTimeCode\"\n                onSubmitEditing={onSubmit}\n              />\n              <Button\n                variant=\"link\"\n                size=\"sm\"\n                disabled={countdown > 0}\n                onPress={() => {\n                  // TODO: Resend code\n                  restartCountdown();\n                }}>\n                <Text className=\"text-center text-xs\">\n                  Didn&apos;t receive the code? Resend{' '}\n                  {countdown > 0 ? (\n                    <Text className=\"text-xs\" style={TABULAR_NUMBERS_STYLE}>\n                      ({countdown})\n                    </Text>\n                  ) : null}\n                </Text>\n              </Button>\n            </View>\n            <View className=\"gap-3\">\n              <Button className=\"w-full\" onPress={onSubmit}>\n                <Text>Continue</Text>\n              </Button>\n              <Button\n                variant=\"link\"\n                className=\"mx-auto\"\n                onPress={() => {\n                  // TODO: Navigate to sign up screen\n                }}>\n                <Text>Cancel</Text>\n              </Button>\n            </View>\n          </View>\n        </CardContent>\n      </Card>\n    </View>\n  );\n}\n\nfunction useCountdown(seconds = 30) {\n  const [countdown, setCountdown] = React.useState(seconds);\n  const intervalRef = React.useRef<ReturnType<typeof setInterval> | null>(null);\n\n  const startCountdown = React.useCallback(() => {\n    setCountdown(seconds);\n\n    if (intervalRef.current) {\n      clearInterval(intervalRef.current);\n    }\n\n    intervalRef.current = setInterval(() => {\n      setCountdown((prev) => {\n        if (prev <= 1) {\n          if (intervalRef.current) {\n            clearInterval(intervalRef.current);\n            intervalRef.current = null;\n          }\n          return 0;\n        }\n        return prev - 1;\n      });\n    }, 1000);\n  }, [seconds]);\n\n  React.useEffect(() => {\n    startCountdown();\n\n    return () => {\n      if (intervalRef.current) {\n        clearInterval(intervalRef.current);\n      }\n    };\n  }, [startCountdown]);\n\n  return { countdown, restartCountdown: startCountdown };\n}\n"
  },
  {
    "path": "packages/registry/src/examples/accordion.tsx",
    "content": "import {\n  Accordion,\n  AccordionContent,\n  AccordionItem,\n  AccordionTrigger,\n} from '@/registry/nativewind/components/ui/accordion';\nimport { Text } from '@/registry/nativewind/components/ui/text';\n\nexport function AccordionPreview() {\n  return (\n    <Accordion type=\"single\" collapsible className=\"w-full max-w-lg\" defaultValue=\"item-1\">\n      <AccordionItem value=\"item-1\">\n        <AccordionTrigger>\n          <Text>Product Information</Text>\n        </AccordionTrigger>\n        <AccordionContent className=\"flex flex-col gap-4 text-balance\">\n          <Text>\n            Our flagship product combines cutting-edge technology with sleek design. Built with\n            premium materials, it offers unparalleled performance and reliability.\n          </Text>\n          <Text>\n            Key features include advanced processing capabilities, and an intuitive user interface\n            designed for both beginners and experts.\n          </Text>\n        </AccordionContent>\n      </AccordionItem>\n      <AccordionItem value=\"item-2\">\n        <AccordionTrigger>\n          <Text>Shipping Details</Text>\n        </AccordionTrigger>\n        <AccordionContent className=\"flex flex-col gap-4 text-balance\">\n          <Text>\n            We offer worldwide shipping through trusted courier partners. Standard delivery takes\n            3-5 business days, while express shipping ensures delivery within 1-2 business days.\n          </Text>\n          <Text>\n            All orders are carefully packaged and fully insured. Track your shipment in real-time\n            through our dedicated tracking portal.\n          </Text>\n        </AccordionContent>\n      </AccordionItem>\n      <AccordionItem value=\"item-3\">\n        <AccordionTrigger>\n          <Text>Return Policy</Text>\n        </AccordionTrigger>\n        <AccordionContent className=\"flex flex-col gap-4 text-balance\">\n          <Text>\n            We stand behind our products with a comprehensive 30-day return policy. If you&apos;re\n            not completely satisfied, simply return the item in its original condition.\n          </Text>\n          <Text>\n            Our hassle-free return process includes free return shipping and full refunds processed\n            within 48 hours of receiving the returned item.\n          </Text>\n        </AccordionContent>\n      </AccordionItem>\n    </Accordion>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/alert-dialog.tsx",
    "content": "import {\n  AlertDialog,\n  AlertDialogAction,\n  AlertDialogCancel,\n  AlertDialogContent,\n  AlertDialogDescription,\n  AlertDialogFooter,\n  AlertDialogHeader,\n  AlertDialogTitle,\n  AlertDialogTrigger,\n} from '@/registry/nativewind/components/ui/alert-dialog';\nimport { Button } from '@/registry/nativewind/components/ui/button';\nimport { Text } from '@/registry/nativewind/components/ui/text';\n\nexport function AlertDialogPreview() {\n  return (\n    <AlertDialog>\n      <AlertDialogTrigger asChild>\n        <Button variant=\"outline\">\n          <Text>Show Alert Dialog</Text>\n        </Button>\n      </AlertDialogTrigger>\n      <AlertDialogContent>\n        <AlertDialogHeader>\n          <AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle>\n          <AlertDialogDescription>\n            This action cannot be undone. This will permanently delete your account and remove your\n            data from our servers.\n          </AlertDialogDescription>\n        </AlertDialogHeader>\n        <AlertDialogFooter>\n          <AlertDialogCancel>\n            <Text>Cancel</Text>\n          </AlertDialogCancel>\n          <AlertDialogAction>\n            <Text>Continue</Text>\n          </AlertDialogAction>\n        </AlertDialogFooter>\n      </AlertDialogContent>\n    </AlertDialog>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/alert.tsx",
    "content": "import { Alert, AlertDescription, AlertTitle } from '@/registry/nativewind/components/ui/alert';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { AlertCircleIcon, CheckCircle2Icon, Terminal } from 'lucide-react-native';\nimport { View } from 'react-native';\n\nexport function AlertPreview() {\n  return (\n    <View className=\"w-full max-w-xl gap-4\">\n      <Alert icon={CheckCircle2Icon}>\n        <AlertTitle>Success! Your changes have been saved</AlertTitle>\n        <AlertDescription>This is an alert with icon, title and description.</AlertDescription>\n      </Alert>\n      <Alert icon={Terminal}>\n        <AlertTitle>This Alert has no description.</AlertTitle>\n      </Alert>\n      <Alert variant=\"destructive\" icon={AlertCircleIcon}>\n        <AlertTitle>Unable to process your payment.</AlertTitle>\n        <AlertDescription>Please verify your billing information and try again.</AlertDescription>\n        <View role=\"list\" className=\"ml-0.5 pb-2 pl-6\">\n          <Text role=\"listitem\" className=\"text-sm\">\n            <Text className=\"web:pr-2\">•</Text> Check your card details\n          </Text>\n          <Text role=\"listitem\" className=\"text-sm\">\n            <Text className=\"web:pr-2\">•</Text> Ensure sufficient funds\n          </Text>\n          <Text role=\"listitem\" className=\"text-sm\">\n            <Text className=\"web:pr-2\">•</Text> Verify billing address\n          </Text>\n        </View>\n      </Alert>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/aspect-ratio.tsx",
    "content": "import { AspectRatio } from '@/registry/nativewind/components/ui/aspect-ratio';\nimport { Image } from 'react-native';\n\nexport function AspectRatioPreview() {\n  return (\n    <AspectRatio ratio={16 / 9} className=\"relative aspect-video w-full overflow-hidden rounded-md\">\n      <Image\n        source={{\n          uri: 'https://images.unsplash.com/photo-1672758247442-82df22f5899e',\n        }}\n        alt=\"Photo by Drew Beamer (https://unsplash.com/@dbeamer_jpg)\"\n        className=\"absolute bottom-0 left-0 right-0 top-0 object-cover\"\n      />\n    </AspectRatio>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/avatar.tsx",
    "content": "import { Avatar, AvatarFallback, AvatarImage } from '@/registry/nativewind/components/ui/avatar';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { View } from 'react-native';\n\nexport function AvatarPreview() {\n  return (\n    <View className=\"flex-row flex-wrap gap-12\">\n      <Avatar\n        alt=\"@mrzachnugent\"\n        className=\"border-background web:border-0 web:ring-2 web:ring-background border-2\">\n        <AvatarImage source={{ uri: 'https://github.com/mrzachnugent.png' }} />\n        <AvatarFallback>\n          <Text>ZN</Text>\n        </AvatarFallback>\n      </Avatar>\n      <Avatar\n        alt=\"@shadcn\"\n        className=\"border-background web:border-0 web:ring-2 web:ring-background rounded-lg border-2\">\n        <AvatarImage source={{ uri: 'https://github.com/shadcn.png' }} />\n        <AvatarFallback>\n          <Text>CN</Text>\n        </AvatarFallback>\n      </Avatar>\n      <View className=\"flex-row\">\n        <Avatar\n          alt=\"@mrzachnugent\"\n          className=\"border-background web:border-0 web:ring-2 web:ring-background -mr-2 border-2\">\n          <AvatarImage source={{ uri: 'https://github.com/mrzachnugent.png' }} />\n          <AvatarFallback>\n            <Text>ZN</Text>\n          </AvatarFallback>\n        </Avatar>\n        <Avatar\n          alt=\"@leerob\"\n          className=\"border-background web:border-0 web:ring-2 web:ring-background -mr-2 border-2\">\n          <AvatarImage source={{ uri: 'https://github.com/leerob.png' }} />\n          <AvatarFallback>\n            <Text>LR</Text>\n          </AvatarFallback>\n        </Avatar>\n        <Avatar\n          alt=\"@evilrabbit\"\n          className=\"border-background web:border-0 web:ring-2 web:ring-background -mr-2 border-2\">\n          <AvatarImage source={{ uri: 'https://github.com/evilrabbit.png' }} />\n          <AvatarFallback>\n            <Text>ER</Text>\n          </AvatarFallback>\n        </Avatar>\n      </View>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/badge.tsx",
    "content": "import { Badge } from '@/registry/nativewind/components/ui/badge';\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { BadgeCheckIcon } from 'lucide-react-native';\nimport { View } from 'react-native';\n\nexport function BadgePreview() {\n  return (\n    <View className=\"flex flex-col items-center gap-2\">\n      <View className=\"flex w-full flex-row flex-wrap gap-2\">\n        <Badge>\n          <Text>Badge</Text>\n        </Badge>\n        <Badge variant=\"secondary\">\n          <Text>Secondary</Text>\n        </Badge>\n        <Badge variant=\"destructive\">\n          <Text>Destructive</Text>\n        </Badge>\n        <Badge variant=\"outline\">\n          <Text>Outline</Text>\n        </Badge>\n      </View>\n      <View className=\"flex w-full flex-row flex-wrap gap-2\">\n        <Badge variant=\"secondary\" className=\"bg-blue-500 dark:bg-blue-600\">\n          <Icon as={BadgeCheckIcon} className=\"text-white\" />\n          <Text className=\"text-white\">Verified</Text>\n        </Badge>\n        <Badge className=\"min-w-5 rounded-full px-1\">\n          <Text>8</Text>\n        </Badge>\n        <Badge className=\"min-w-5 rounded-full px-1\" variant=\"destructive\">\n          <Text>99</Text>\n        </Badge>\n        <Badge className=\"min-w-5 rounded-full px-1\" variant=\"outline\">\n          <Text>20+</Text>\n        </Badge>\n      </View>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/button/button-destructive.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport { Text } from '@/registry/nativewind/components/ui/text';\n\nexport function ButtonDestructivePreview() {\n  return (\n    <Button variant=\"destructive\">\n      <Text>Destructive</Text>\n    </Button>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/button/button-ghost.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport { Text } from '@/registry/nativewind/components/ui/text';\n\nexport function ButtonGhostPreview() {\n  return (\n    <Button variant=\"ghost\">\n      <Text>Ghost</Text>\n    </Button>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/button/button-icon.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { ChevronRight } from 'lucide-react-native';\n\nexport function ButtonIconPreview() {\n  return (\n    <Button variant=\"outline\" size=\"icon\">\n      <Icon as={ChevronRight} />\n    </Button>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/button/button-link.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport { Text } from '@/registry/nativewind/components/ui/text';\n\nexport function ButtonLinkPreview() {\n  return (\n    <Button variant=\"link\">\n      <Text>Link</Text>\n    </Button>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/button/button-loading.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { Loader2 } from 'lucide-react-native';\nimport { View } from 'react-native';\n\nexport function ButtonLoadingPreview() {\n  return (\n    <Button disabled>\n      <View className=\"pointer-events-none animate-spin\">\n        <Icon as={Loader2} className=\"text-primary-foreground\" />\n      </View>\n      <Text>Please wait</Text>\n    </Button>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/button/button-outline.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport { Text } from '@/registry/nativewind/components/ui/text';\n\nexport function ButtonOutlinePreview() {\n  return (\n    <Button variant=\"outline\">\n      <Text>Outline</Text>\n    </Button>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/button/button-primary.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport { Text } from '@/registry/nativewind/components/ui/text';\n\nexport function ButtonPreview() {\n  return (\n    <Button>\n      <Text>Button</Text>\n    </Button>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/button/button-secondary.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport { Text } from '@/registry/nativewind/components/ui/text';\n\nexport function ButtonSecondaryPreview() {\n  return (\n    <Button variant=\"secondary\">\n      <Text>Secondary</Text>\n    </Button>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/button/button-with-icon.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { Mail } from 'lucide-react-native';\n\nexport function ButtonWithIconPreview() {\n  return (\n    <Button>\n      <Icon as={Mail} className=\"text-primary-foreground\" />\n      <Text>Login with Email</Text>\n    </Button>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/button/index.ts",
    "content": "export * from './button-destructive';\nexport * from './button-ghost';\nexport * from './button-link';\nexport * from './button-outline';\nexport * from './button-secondary';\nexport * from './button-icon';\nexport * from './button-loading';\nexport * from './button-primary';\nexport * from './button-with-icon';\n"
  },
  {
    "path": "packages/registry/src/examples/card.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from '@/registry/nativewind/components/ui/card';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { View } from 'react-native';\n\nexport function CardPreview() {\n  return (\n    <Card className=\"w-full max-w-sm\">\n      <CardHeader className=\"flex-row\">\n        <View className=\"flex-1 gap-1.5\">\n          <CardTitle>Subscribe to our newsletter</CardTitle>\n          <CardDescription>Enter your details to receive updates and tips</CardDescription>\n        </View>\n      </CardHeader>\n      <CardContent>\n        <View className=\"w-full justify-center gap-4\">\n          <View className=\"gap-2\">\n            <Label htmlFor=\"email\">Email</Label>\n            <Input id=\"email\" placeholder=\"m@example.com\" />\n          </View>\n          <View className=\"gap-2\">\n            <Label htmlFor=\"name\">Name</Label>\n            <Input id=\"name\" placeholder=\"John Doe\" />\n          </View>\n        </View>\n      </CardContent>\n      <CardFooter className=\"flex-col gap-2\">\n        <Button className=\"w-full\">\n          <Text>Subscribe</Text>\n        </Button>\n        <Button variant=\"outline\" className=\"w-full\">\n          <Text>Later</Text>\n        </Button>\n      </CardFooter>\n    </Card>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/checkbox.tsx",
    "content": "import { Checkbox } from '@/registry/nativewind/components/ui/checkbox';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as Haptics from 'expo-haptics';\nimport * as React from 'react';\nimport { Platform, View } from 'react-native';\n\nexport function CheckboxPreview() {\n  const [state, setState] = React.useState({\n    termsChecked: true,\n    terms2Checked: true,\n    toggleChecked: false,\n    toggle2Checked: false,\n  });\n\n  function toggleCheckedState(key: keyof typeof state) {\n    return () => {\n      Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n      setState((prev) => ({\n        ...prev,\n        [key]: !prev[key],\n      }));\n    };\n  }\n\n  return (\n    <View className=\"flex flex-col gap-6\">\n      <View className=\"flex flex-row items-center gap-3\">\n        <Checkbox\n          id=\"terms\"\n          checked={state.termsChecked}\n          onCheckedChange={toggleCheckedState('termsChecked')}\n        />\n        <Label\n          onPress={Platform.select({ native: toggleCheckedState('termsChecked') })}\n          htmlFor=\"terms\">\n          Accept terms and conditions\n        </Label>\n      </View>\n      <View className=\"flex flex-row items-start gap-3\">\n        <Checkbox\n          id=\"terms-2\"\n          checked={state.terms2Checked}\n          onCheckedChange={toggleCheckedState('terms2Checked')}\n        />\n        <View className=\"flex-1 gap-2\">\n          <Label\n            onPress={Platform.select({ native: toggleCheckedState('terms2Checked') })}\n            htmlFor=\"terms-2\">\n            Accept terms and conditions\n          </Label>\n          <Text className=\"text-muted-foreground text-sm\">\n            By clicking this checkbox, you agree to the terms and conditions.\n          </Text>\n        </View>\n      </View>\n      <View className=\"flex flex-row items-start gap-3\">\n        <Checkbox\n          id=\"toggle\"\n          disabled\n          checked={state.toggleChecked}\n          onCheckedChange={toggleCheckedState('toggleChecked')}\n        />\n        <Label\n          onPress={Platform.select({ native: toggleCheckedState('toggleChecked') })}\n          htmlFor=\"toggle\"\n          disabled>\n          Enable notifications\n        </Label>\n      </View>\n      <Label\n        onPress={Platform.select({ native: toggleCheckedState('toggle2Checked') })}\n        htmlFor=\"toggle-2\"\n        className={cn(\n          'web:hover:bg-accent/50 border-border flex flex-row rounded-lg border p-3',\n          state.toggle2Checked &&\n            'web:hover:bg-blue-50 border-blue-600 bg-blue-50 dark:border-blue-900 dark:bg-blue-950'\n        )}>\n        <View className=\"flex flex-1 flex-row items-start gap-3\">\n          <Checkbox\n            id=\"toggle-2\"\n            checked={state.toggle2Checked}\n            onCheckedChange={toggleCheckedState('toggle2Checked')}\n            checkedClassName=\"border-blue-600 bg-blue-600 dark:border-blue-700\"\n            indicatorClassName=\"bg-blue-600 dark:bg-blue-700\"\n            iconClassName=\"text-white\"\n          />\n          <View className=\"flex-1\">\n            <Text className=\"text-sm font-medium leading-none\">Enable notifications</Text>\n            <Text className=\"text-muted-foreground text-sm\">\n              You can enable or disable notifications at any time.\n            </Text>\n          </View>\n        </View>\n      </Label>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/collapsible.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Collapsible,\n  CollapsibleContent,\n  CollapsibleTrigger,\n} from '@/registry/nativewind/components/ui/collapsible';\nimport { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { ChevronsUpDown } from 'lucide-react-native';\nimport { Text, View } from 'react-native';\n\nexport function CollapsiblePreview() {\n  return (\n    <Collapsible className=\"flex w-[350px] flex-row flex-col gap-2\">\n      <View className=\"flex flex-row items-center justify-between gap-4 px-4\">\n        <Text className=\"text-foreground text-sm font-semibold\">\n          @peduarte starred 3 repositories\n        </Text>\n        <CollapsibleTrigger asChild>\n          <Button variant=\"ghost\" size=\"icon\" className=\"size-8\">\n            <Icon as={ChevronsUpDown} className=\"text-foreground\" />\n            <Text className=\"sr-only\">Toggle</Text>\n          </Button>\n        </CollapsibleTrigger>\n      </View>\n      <View className=\"border-border rounded-md border px-4 py-2\">\n        <Text className='text-foreground text-sm\"'>@radix-ui/primitives</Text>\n      </View>\n      <CollapsibleContent className=\"gap-2\">\n        <View className=\"border-border rounded-md border px-4 py-2\">\n          <Text className=\"text-foreground text-sm\">@radix-ui/react</Text>\n        </View>\n        <View className=\"border-border rounded-md border px-4 py-2\">\n          <Text className=\"text-foreground text-sm\">@stitches/core</Text>\n        </View>\n      </CollapsibleContent>\n    </Collapsible>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/context-menu.tsx",
    "content": "import {\n  ContextMenu,\n  ContextMenuCheckboxItem,\n  ContextMenuContent,\n  ContextMenuItem,\n  ContextMenuLabel,\n  ContextMenuRadioGroup,\n  ContextMenuRadioItem,\n  ContextMenuSeparator,\n  ContextMenuShortcut,\n  ContextMenuSub,\n  ContextMenuSubContent,\n  ContextMenuSubTrigger,\n  ContextMenuTrigger,\n} from '@/registry/nativewind/components/ui/context-menu';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport * as Haptics from 'expo-haptics';\nimport * as React from 'react';\nimport { Platform } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nexport function ContextMenuPreview() {\n  const insets = useSafeAreaInsets();\n  const contentInsets = {\n    top: insets.top,\n    bottom: insets.bottom,\n    left: 12,\n    right: 12,\n  };\n  const [checkboxValue, setCheckboxValue] = React.useState(false);\n  const [checkboxValue2, setCheckboxValue2] = React.useState(false);\n  const [radioValue, setRadioValue] = React.useState('pedro');\n\n  function onLongPress() {\n    Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n  }\n\n  return (\n    <ContextMenu className=\"h-[150px] w-[300px]\">\n      <ContextMenuTrigger\n        onLongPress={onLongPress}\n        className=\"border-border web:outline-none web:cursor-default flex h-full w-full items-center justify-center rounded-md border border-dashed\">\n        <Text className=\"text-sm\">\n          {Platform.select({ web: 'Right click here', native: 'Long press here' })}\n        </Text>\n      </ContextMenuTrigger>\n      <ContextMenuContent className=\"w-52\" insets={contentInsets}>\n        <ContextMenuItem inset>\n          <Text>Back</Text>\n          <ContextMenuShortcut>⌘[</ContextMenuShortcut>\n        </ContextMenuItem>\n        <ContextMenuItem inset disabled>\n          <Text>Forward</Text>\n          <ContextMenuShortcut>⌘]</ContextMenuShortcut>\n        </ContextMenuItem>\n        <ContextMenuItem inset>\n          <Text>Reload</Text>\n          <ContextMenuShortcut>⌘R</ContextMenuShortcut>\n        </ContextMenuItem>\n        <ContextMenuSub>\n          <ContextMenuSubTrigger inset>\n            <Text>More Tools</Text>\n          </ContextMenuSubTrigger>\n          <ContextMenuSubContent className=\"web:w-44\">\n            <ContextMenuItem>\n              <Text>Save Page...</Text>\n            </ContextMenuItem>\n            <ContextMenuItem>\n              <Text>Create Shortcut...</Text>\n            </ContextMenuItem>\n            <ContextMenuItem>\n              <Text>Name Window...</Text>\n            </ContextMenuItem>\n            <ContextMenuSeparator />\n            <ContextMenuItem>\n              <Text>Developer Tools</Text>\n            </ContextMenuItem>\n            <ContextMenuSeparator />\n            <ContextMenuItem variant=\"destructive\">\n              <Text>Delete</Text>\n            </ContextMenuItem>\n          </ContextMenuSubContent>\n        </ContextMenuSub>\n        <ContextMenuSeparator />\n        <ContextMenuCheckboxItem\n          closeOnPress={false}\n          checked={checkboxValue}\n          onCheckedChange={setCheckboxValue}>\n          <Text>Show Bookmarks</Text>\n        </ContextMenuCheckboxItem>\n        <ContextMenuCheckboxItem\n          closeOnPress={false}\n          checked={checkboxValue2}\n          onCheckedChange={setCheckboxValue2}>\n          <Text>Show Full URLs</Text>\n        </ContextMenuCheckboxItem>\n        <ContextMenuSeparator />\n        <ContextMenuRadioGroup value={radioValue} onValueChange={setRadioValue}>\n          <ContextMenuLabel inset>People</ContextMenuLabel>\n          <ContextMenuRadioItem closeOnPress={false} value=\"pedro\">\n            <Text>Pedro Duarte</Text>\n          </ContextMenuRadioItem>\n          <ContextMenuRadioItem closeOnPress={false} value=\"colm\">\n            <Text>Colm Tuite</Text>\n          </ContextMenuRadioItem>\n        </ContextMenuRadioGroup>\n      </ContextMenuContent>\n    </ContextMenu>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/dialog.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Dialog,\n  DialogClose,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n  DialogTrigger,\n} from '@/registry/nativewind/components/ui/dialog';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { View } from 'react-native';\n\nexport function DialogPreview() {\n  return (\n    <Dialog>\n      <DialogTrigger asChild>\n        <Button variant=\"outline\">\n          <Text>Open Dialog</Text>\n        </Button>\n      </DialogTrigger>\n      <DialogContent className=\"sm:max-w-[425px]\">\n        <DialogHeader>\n          <DialogTitle>Edit profile</DialogTitle>\n          <DialogDescription>\n            Make changes to your profile here. Click save when you&apos;re done.\n          </DialogDescription>\n        </DialogHeader>\n        <View className=\"grid gap-4\">\n          <View className=\"grid gap-3\">\n            <Label htmlFor=\"name-1\">Name</Label>\n            <Input id=\"name-1\" defaultValue=\"Pedro Duarte\" />\n          </View>\n          <View className=\"grid gap-3\">\n            <Label htmlFor=\"username-1\">Username</Label>\n            <Input id=\"username-1\" defaultValue=\"@peduarte\" />\n          </View>\n        </View>\n        <DialogFooter>\n          <DialogClose asChild>\n            <Button variant=\"outline\">\n              <Text>Cancel</Text>\n            </Button>\n          </DialogClose>\n          <Button>\n            <Text>Save changes</Text>\n          </Button>\n        </DialogFooter>\n      </DialogContent>\n    </Dialog>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/dropdown-menu.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuGroup,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuShortcut,\n  DropdownMenuSub,\n  DropdownMenuSubContent,\n  DropdownMenuSubTrigger,\n  DropdownMenuTrigger,\n} from '@/registry/nativewind/components/ui/dropdown-menu';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nexport function DropdownMenuPreview() {\n  const insets = useSafeAreaInsets();\n  const contentInsets = {\n    top: insets.top,\n    bottom: insets.bottom,\n    left: 4,\n    right: 4,\n  };\n\n  return (\n    <DropdownMenu>\n      <DropdownMenuTrigger asChild>\n        <Button variant=\"outline\">\n          <Text>Open</Text>\n        </Button>\n      </DropdownMenuTrigger>\n      <DropdownMenuContent insets={contentInsets} sideOffset={2} className=\"w-56\" align=\"start\">\n        <DropdownMenuLabel>My Account</DropdownMenuLabel>\n        <DropdownMenuSeparator />\n        <DropdownMenuGroup>\n          <DropdownMenuItem>\n            <Text>Profile</Text>\n            <DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>\n          </DropdownMenuItem>\n          <DropdownMenuItem>\n            <Text>Billing</Text>\n            <DropdownMenuShortcut>⌘B</DropdownMenuShortcut>\n          </DropdownMenuItem>\n          <DropdownMenuItem>\n            <Text>Settings</Text>\n            <DropdownMenuShortcut>⌘S</DropdownMenuShortcut>\n          </DropdownMenuItem>\n          <DropdownMenuItem>\n            <Text>Keyboard shortcuts</Text>\n            <DropdownMenuShortcut>⌘K</DropdownMenuShortcut>\n          </DropdownMenuItem>\n        </DropdownMenuGroup>\n        <DropdownMenuSeparator />\n        <DropdownMenuGroup>\n          <DropdownMenuItem>\n            <Text>Team</Text>\n          </DropdownMenuItem>\n          <DropdownMenuSub>\n            <DropdownMenuSubTrigger>\n              <Text>Invite users</Text>\n            </DropdownMenuSubTrigger>\n            <DropdownMenuSubContent>\n              <DropdownMenuItem>\n                <Text>Email</Text>\n              </DropdownMenuItem>\n              <DropdownMenuItem>\n                <Text>Message</Text>\n              </DropdownMenuItem>\n              <DropdownMenuSeparator />\n              <DropdownMenuItem>\n                <Text>More...</Text>\n              </DropdownMenuItem>\n            </DropdownMenuSubContent>\n          </DropdownMenuSub>\n          <DropdownMenuItem>\n            <Text>New Team</Text>\n            <DropdownMenuShortcut>⌘+T</DropdownMenuShortcut>\n          </DropdownMenuItem>\n        </DropdownMenuGroup>\n        <DropdownMenuSeparator />\n        <DropdownMenuItem>\n          <Text>GitHub</Text>\n        </DropdownMenuItem>\n        <DropdownMenuItem>\n          <Text>Support</Text>\n        </DropdownMenuItem>\n        <DropdownMenuItem disabled>\n          <Text>API</Text>\n        </DropdownMenuItem>\n        <DropdownMenuSeparator />\n        <DropdownMenuItem>\n          <Text>Log out</Text>\n          <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>\n        </DropdownMenuItem>\n      </DropdownMenuContent>\n    </DropdownMenu>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/hover-card.tsx",
    "content": "import { Avatar, AvatarFallback, AvatarImage } from '@/registry/nativewind/components/ui/avatar';\nimport { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  HoverCard,\n  HoverCardContent,\n  HoverCardTrigger,\n} from '@/registry/nativewind/components/ui/hover-card';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nexport function HoverCardPreview() {\n  const insets = useSafeAreaInsets();\n  const contentInsets = {\n    top: insets.top,\n    bottom: insets.bottom,\n    left: 12,\n    right: 12,\n  };\n  return (\n    <HoverCard>\n      <HoverCardTrigger asChild>\n        <Button variant=\"link\">\n          <Text>@expo</Text>\n        </Button>\n      </HoverCardTrigger>\n      <HoverCardContent insets={contentInsets} className=\"w-80\">\n        <View className=\"flex flex-row justify-between gap-4\">\n          <Avatar alt=\"Vercel avatar\">\n            <AvatarImage source={{ uri: 'https://github.com/expo.png' }} />\n            <AvatarFallback>\n              <Text>E</Text>\n            </AvatarFallback>\n          </Avatar>\n          <View className=\"flex-1 gap-1\">\n            <Text className=\"text-sm font-semibold\">@expo</Text>\n            <Text className=\"text-sm\">\n              Framework and tools for creating native apps with React.\n            </Text>\n            <Text className=\"text-muted-foreground text-xs\">Joined December 2021</Text>\n          </View>\n        </View>\n      </HoverCardContent>\n    </HoverCard>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/index.ts",
    "content": "export * from './accordion';\nexport * from './alert';\nexport * from './alert-dialog';\nexport * from './aspect-ratio';\nexport * from './avatar';\nexport * from './badge';\nexport * from './button/button-destructive';\nexport * from './button/button-ghost';\nexport * from './button/button-icon';\nexport * from './button/button-link';\nexport * from './button/button-loading';\nexport * from './button/button-outline';\nexport * from './button/button-primary';\nexport * from './button/button-secondary';\nexport * from './button/button-with-icon';\nexport * from './card';\nexport * from './checkbox';\nexport * from './collapsible';\nexport * from './context-menu';\nexport * from './dialog';\nexport * from './dropdown-menu';\nexport * from './hover-card';\nexport * from './input';\nexport * from './label';\nexport * from './menubar';\nexport * from './popover';\nexport * from './progress';\nexport * from './radio-group';\nexport * from './select';\nexport * from './separator';\nexport * from './skeleton';\nexport * from './switch';\nexport * from './tabs';\nexport * from './text';\nexport * from './textarea';\nexport * from './toggle';\nexport * from './toggle-group';\nexport * from './tooltip';\n"
  },
  {
    "path": "packages/registry/src/examples/input.tsx",
    "content": "import { Input } from '@/registry/nativewind/components/ui/input';\n\nexport function InputPreview() {\n  return (\n    <Input\n      keyboardType=\"email-address\"\n      textContentType=\"emailAddress\"\n      autoComplete=\"email\"\n      placeholder=\"Email\"\n    />\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/label.tsx",
    "content": "import { Checkbox } from '@/registry/nativewind/components/ui/checkbox';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport * as Haptics from 'expo-haptics';\nimport * as React from 'react';\nimport { Platform, View } from 'react-native';\n\nexport function LabelPreview() {\n  const [checked, setChecked] = React.useState(false);\n\n  function onCheckedChange(checked: boolean) {\n    Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n    setChecked(checked);\n  }\n\n  return (\n    <View className=\"flex-row items-center gap-2\">\n      <Checkbox\n        aria-labelledby=\"terms-checkbox\"\n        id=\"terms-checkbox\"\n        checked={checked}\n        onCheckedChange={onCheckedChange}\n      />\n      <Label\n        nativeID=\"terms-checkbox\"\n        htmlFor=\"terms-checkbox\"\n        onPress={Platform.select({\n          native: () => {\n            Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n            setChecked((prev) => !prev);\n          },\n        })}>\n        Accept terms and conditions\n      </Label>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/menubar.tsx",
    "content": "import {\n  Menubar,\n  MenubarCheckboxItem,\n  MenubarContent,\n  MenubarItem,\n  MenubarMenu,\n  MenubarRadioGroup,\n  MenubarRadioItem,\n  MenubarSeparator,\n  MenubarShortcut,\n  MenubarSub,\n  MenubarSubContent,\n  MenubarSubTrigger,\n  MenubarTrigger,\n} from '@/registry/nativewind/components/ui/menubar';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport * as React from 'react';\nimport Animated, { FadeIn } from 'react-native-reanimated';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nexport function MenubarPreview() {\n  const insets = useSafeAreaInsets();\n  const contentInsets = {\n    top: insets.top,\n    bottom: insets.bottom,\n    left: 12,\n    right: 12,\n  };\n  const [value, setValue] = React.useState<string | undefined>();\n  const [isSubOpen, setIsSubOpen] = React.useState(false);\n  const [isSubOpen2, setIsSubOpen2] = React.useState(false);\n  const [isChecked, setIsChecked] = React.useState(false);\n  const [isChecked2, setIsChecked2] = React.useState(false);\n  const [radio, setRadio] = React.useState('michael');\n\n  /**\n   * NOTE:\n   * On mobile, if the menu is open and the user is about to go to a new screen,\n   * it's best to close the menu first.\n   */\n\n  function closeSubs() {\n    setIsSubOpen(false);\n    setIsSubOpen2(false);\n  }\n\n  function onValueChange(val: string | undefined) {\n    if (typeof val === 'string') {\n      setValue(val);\n      return;\n    }\n    closeSubs();\n    setValue(undefined);\n  }\n\n  return (\n    <Menubar value={value} onValueChange={onValueChange}>\n      <MenubarMenu value=\"file\">\n        <MenubarTrigger onPress={closeSubs}>\n          <Text>File</Text>\n        </MenubarTrigger>\n        <MenubarContent insets={contentInsets}>\n          <MenubarItem>\n            <Text>New Tab</Text>\n            <MenubarShortcut>⌘T</MenubarShortcut>\n          </MenubarItem>\n          <MenubarItem>\n            <Text>New Window</Text>\n            <MenubarShortcut>⌘N</MenubarShortcut>\n          </MenubarItem>\n          <MenubarItem disabled>\n            <Text>New Incognito Window</Text>\n          </MenubarItem>\n          <MenubarSeparator />\n          <MenubarSub open={isSubOpen} onOpenChange={setIsSubOpen}>\n            <MenubarSubTrigger>\n              <Text>Share</Text>\n            </MenubarSubTrigger>\n            <MenubarSubContent>\n              <Animated.View entering={FadeIn.duration(200)}>\n                <MenubarItem>\n                  <Text>Email link</Text>\n                </MenubarItem>\n                <MenubarItem>\n                  <Text>Messages</Text>\n                </MenubarItem>\n                <MenubarItem>\n                  <Text>Notes</Text>\n                </MenubarItem>\n              </Animated.View>\n            </MenubarSubContent>\n          </MenubarSub>\n          <MenubarSeparator />\n          <MenubarItem>\n            <Text>Print...</Text>\n            <MenubarShortcut>⌘P</MenubarShortcut>\n          </MenubarItem>\n        </MenubarContent>\n      </MenubarMenu>\n      <MenubarMenu value=\"edit\">\n        <MenubarTrigger onPress={closeSubs}>\n          <Text>Edit</Text>\n        </MenubarTrigger>\n        <MenubarContent insets={contentInsets} className=\"native:w-48\">\n          <MenubarItem>\n            <Text>Undo</Text>\n            <MenubarShortcut>⌘Z</MenubarShortcut>\n          </MenubarItem>\n          <MenubarItem>\n            <Text>Redo</Text>\n            <MenubarShortcut>⇧⌘Z</MenubarShortcut>\n          </MenubarItem>\n          <MenubarSeparator />\n          <MenubarSub open={isSubOpen2} onOpenChange={setIsSubOpen2}>\n            <MenubarSubTrigger>\n              <Text>Find</Text>\n            </MenubarSubTrigger>\n            <MenubarSubContent>\n              <Animated.View entering={FadeIn.duration(200)}>\n                <MenubarItem>\n                  <Text>Search the web</Text>\n                </MenubarItem>\n                <MenubarSeparator />\n                <MenubarItem>\n                  <Text>Find...</Text>\n                </MenubarItem>\n                <MenubarItem>\n                  <Text>Find Next</Text>\n                </MenubarItem>\n                <MenubarItem>\n                  <Text>Find Previous</Text>\n                </MenubarItem>\n              </Animated.View>\n            </MenubarSubContent>\n          </MenubarSub>\n          <MenubarSeparator />\n          <MenubarItem>\n            <Text>Cut</Text>\n          </MenubarItem>\n          <MenubarItem>\n            <Text>Copy</Text>\n          </MenubarItem>\n          <MenubarItem>\n            <Text>Paste</Text>\n          </MenubarItem>\n        </MenubarContent>\n      </MenubarMenu>\n      <MenubarMenu value=\"view\">\n        <MenubarTrigger onPress={closeSubs}>\n          <Text>View</Text>\n        </MenubarTrigger>\n        <MenubarContent insets={contentInsets}>\n          <MenubarCheckboxItem\n            checked={isChecked}\n            onCheckedChange={setIsChecked}\n            closeOnPress={false}>\n            <Text>Always Show Bookmarks Bar</Text>\n          </MenubarCheckboxItem>\n          <MenubarCheckboxItem\n            checked={isChecked2}\n            onCheckedChange={setIsChecked2}\n            closeOnPress={false}>\n            <Text>Always Show Full URLs</Text>\n          </MenubarCheckboxItem>\n          <MenubarSeparator />\n          <MenubarItem inset>\n            <Text>Reload</Text>\n            <MenubarShortcut>⌘R</MenubarShortcut>\n          </MenubarItem>\n          <MenubarItem disabled inset>\n            <Text>Force Reload</Text>\n            <MenubarShortcut>⇧⌘R</MenubarShortcut>\n          </MenubarItem>\n          <MenubarSeparator />\n          <MenubarItem inset>\n            <Text>Toggle Fullscreen</Text>\n          </MenubarItem>\n          <MenubarSeparator />\n          <MenubarItem inset>\n            <Text>Hide Sidebar</Text>\n          </MenubarItem>\n        </MenubarContent>\n      </MenubarMenu>\n      <MenubarMenu value=\"profile\">\n        <MenubarTrigger onPress={closeSubs}>\n          <Text>Profiles</Text>\n        </MenubarTrigger>\n        <MenubarContent insets={contentInsets}>\n          <MenubarRadioGroup value={radio} onValueChange={setRadio}>\n            <MenubarRadioItem closeOnPress={false} value=\"andy\">\n              <Text>Andy</Text>\n            </MenubarRadioItem>\n            <MenubarRadioItem closeOnPress={false} value=\"michael\">\n              <Text>Michael</Text>\n            </MenubarRadioItem>\n            <MenubarRadioItem closeOnPress={false} value=\"creed\">\n              <Text>Creed</Text>\n            </MenubarRadioItem>\n          </MenubarRadioGroup>\n          <MenubarSeparator />\n          <MenubarItem inset>\n            <Text>Edit...</Text>\n          </MenubarItem>\n          <MenubarSeparator />\n          <MenubarItem inset>\n            <Text>Add Profile...</Text>\n          </MenubarItem>\n        </MenubarContent>\n      </MenubarMenu>\n    </Menubar>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/popover.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport {\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n} from '@/registry/nativewind/components/ui/popover';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { View } from 'react-native';\n\nexport function PopoverPreview() {\n  return (\n    <Popover>\n      <PopoverTrigger asChild>\n        <Button variant=\"outline\">\n          <Text>Open popover</Text>\n        </Button>\n      </PopoverTrigger>\n      <PopoverContent className=\"w-80\" side=\"top\">\n        <View className=\"gap-4\">\n          <View className=\"gap-2\">\n            <Text className=\"font-medium leading-none\">Dimensions</Text>\n            <Text className=\"text-muted-foreground text-sm\">Set the dimensions for the layer.</Text>\n          </View>\n          <View className=\"gap-2\">\n            <View className=\"flex-row items-center gap-4\">\n              <Label className=\"web:block w-24\" htmlFor=\"width\">\n                Width\n              </Label>\n              <Input id=\"width\" defaultValue=\"100%\" className=\"flex-1 sm:h-8\" />\n            </View>\n            <View className=\"flex-row items-center gap-4\">\n              <Label className=\"web:block w-24\" htmlFor=\"maxWidth\">\n                Max. width\n              </Label>\n              <Input id=\"maxWidth\" defaultValue=\"300px\" className=\"flex-1 sm:h-8\" />\n            </View>\n            <View className=\"flex-row items-center gap-4\">\n              <Label className=\"web:block w-24\" htmlFor=\"height\">\n                Height\n              </Label>\n              <Input id=\"height\" defaultValue=\"25px\" className=\"flex-1 sm:h-8\" />\n            </View>\n            <View className=\"flex-row items-center gap-4\">\n              <Label className=\"web:block w-24\" htmlFor=\"maxHeight\">\n                Max. height\n              </Label>\n              <Input id=\"maxHeight\" defaultValue=\"none\" className=\"flex-1 sm:h-8\" />\n            </View>\n          </View>\n        </View>\n      </PopoverContent>\n    </Popover>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/progress.tsx",
    "content": "import * as React from 'react';\nimport { Progress } from '@/registry/nativewind/components/ui/progress';\n\nexport function ProgressPreview() {\n  const [progress, setProgress] = React.useState(13);\n\n  React.useEffect(() => {\n    const timer = setTimeout(() => setProgress(66), 500);\n    return () => clearTimeout(timer);\n  }, []);\n\n  return <Progress value={progress} className=\"w-3/4 md:w-[60%]\" />;\n}\n"
  },
  {
    "path": "packages/registry/src/examples/radio-group.tsx",
    "content": "import { Label } from '@/registry/nativewind/components/ui/label';\nimport { RadioGroup, RadioGroupItem } from '@/registry/nativewind/components/ui/radio-group';\nimport * as Haptics from 'expo-haptics';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport function RadioGroupPreview() {\n  const [value, setValue] = React.useState('comfortable');\n\n  function onLabelPress(label: string) {\n    return () => {\n      Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n      setValue(label);\n    };\n  }\n\n  function onValueChange(value: string) {\n    Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n    setValue(value);\n  }\n\n  return (\n    <RadioGroup value={value} onValueChange={onValueChange}>\n      <View className=\"flex flex-row items-center gap-3\">\n        <RadioGroupItem value=\"default\" id=\"r1\" />\n        <Label htmlFor=\"r1\" onPress={onLabelPress('default')}>\n          Default\n        </Label>\n      </View>\n      <View className=\"flex flex-row items-center gap-3\">\n        <RadioGroupItem value=\"comfortable\" id=\"r2\" />\n        <Label htmlFor=\"r2\" onPress={onLabelPress('comfortable')}>\n          Comfortable\n        </Label>\n      </View>\n      <View className=\"flex flex-row items-center gap-3\">\n        <RadioGroupItem value=\"compact\" id=\"r3\" />\n        <Label htmlFor=\"r3\" onPress={onLabelPress('compact')}>\n          Compact\n        </Label>\n      </View>\n    </RadioGroup>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/select/index.ts",
    "content": "export * from './select';\nexport * from './scrollable-select';\n"
  },
  {
    "path": "packages/registry/src/examples/select/scrollable-select.tsx",
    "content": "import {\n  Select,\n  SelectContent,\n  SelectGroup,\n  SelectItem,\n  SelectLabel,\n  SelectTrigger,\n  SelectValue,\n} from '@/registry/nativewind/components/ui/select';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport type { TriggerRef } from '@rn-primitives/select';\nimport * as React from 'react';\nimport { Platform } from 'react-native';\nimport { ScrollView } from 'react-native-gesture-handler';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nconst fruits = [\n  { label: 'Apple', value: 'apple' },\n  { label: 'Banana', value: 'banana' },\n  { label: 'Blueberry', value: 'blueberry' },\n  { label: 'Grapes', value: 'grapes' },\n  { label: 'Pineapple', value: 'pineapple' },\n  { label: 'Cherry', value: 'cherry' },\n  { label: 'Strawberry', value: 'strawberry' },\n  { label: 'Orange', value: 'orange' },\n  { label: 'Lemon', value: 'lemon' },\n  { label: 'Kiwi', value: 'kiwi' },\n  { label: 'Mango', value: 'mango' },\n  { label: 'Pomegranate', value: 'pomegranate' },\n  { label: 'Watermelon', value: 'watermelon' },\n  { label: 'Peach', value: 'peach' },\n  { label: 'Pear', value: 'pear' },\n  { label: 'Plum', value: 'plum' },\n  { label: 'Raspberry', value: 'raspberry' },\n  { label: 'Tangerine', value: 'tangerine' },\n];\n\nexport function ScrollableSelectPreview() {\n  const ref = React.useRef<TriggerRef>(null);\n\n  const insets = useSafeAreaInsets();\n  const contentInsets = {\n    top: insets.top,\n    bottom: Platform.select({ ios: insets.bottom, android: insets.bottom + 24 }),\n    left: 12,\n    right: 12,\n  };\n\n  // Workaround for rn-primitives/select not opening on web-mobile\n  function onTouchStart() {\n    ref.current?.open();\n  }\n\n  return (\n    <Select>\n      <SelectTrigger ref={ref} className=\"w-[180px]\" onTouchStart={Platform.select({ web: onTouchStart })}>\n        <SelectValue placeholder=\"Select a fruit\" />\n      </SelectTrigger>\n      <SelectContent insets={contentInsets} className=\"w-[180px]\">\n        <NativeSelectScrollView>\n          <SelectGroup>\n            <SelectLabel>Fruits</SelectLabel>\n            {fruits.map((fruit) => (\n              <SelectItem key={fruit.value} label={fruit.label} value={fruit.value}>\n                {fruit.label}\n              </SelectItem>\n            ))}\n          </SelectGroup>\n        </NativeSelectScrollView>\n      </SelectContent>\n    </Select>\n  );\n}\n\n/**\n * @platform Native only\n * Returns the children on the web\n */\nfunction NativeSelectScrollView({ className, ...props }: React.ComponentProps<typeof ScrollView>) {\n  if (Platform.OS === 'web') {\n    return <>{props.children}</>;\n  }\n  return <ScrollView className={cn('max-h-52', className)} {...props} />;\n}"
  },
  {
    "path": "packages/registry/src/examples/select/select.tsx",
    "content": "import {\n  Select,\n  SelectContent,\n  SelectGroup,\n  SelectItem,\n  SelectLabel,\n  SelectTrigger,\n  SelectValue,\n} from '@/registry/nativewind/components/ui/select';\nimport type { TriggerRef } from '@rn-primitives/select';\nimport * as React from 'react';\nimport { Platform } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nconst fruits = [\n  { label: 'Apple', value: 'apple' },\n  { label: 'Banana', value: 'banana' },\n  { label: 'Blueberry', value: 'blueberry' },\n  { label: 'Grapes', value: 'grapes' },\n  { label: 'Pineapple', value: 'pineapple' },\n];\n\nexport function SelectPreview() {\n  const ref = React.useRef<TriggerRef>(null);\n  const insets = useSafeAreaInsets();\n  const contentInsets = {\n    top: insets.top,\n    bottom: Platform.select({ ios: insets.bottom, android: insets.bottom + 24 }),\n    left: 12,\n    right: 12,\n  };\n\n  // Workaround for rn-primitives/select not opening on web-mobile\n  function onTouchStart() {\n    ref.current?.open();\n  }\n\n  return (\n    <Select>\n      <SelectTrigger ref={ref} className=\"w-[180px]\" onTouchStart={Platform.select({ web: onTouchStart })}>\n        <SelectValue placeholder=\"Select a fruit\" />\n      </SelectTrigger>\n      <SelectContent insets={contentInsets} className=\"w-[180px]\">\n        <SelectGroup>\n          <SelectLabel>Fruits</SelectLabel>\n          {fruits.map((fruit) => (\n            <SelectItem key={fruit.value} label={fruit.label} value={fruit.value}>\n              {fruit.label}\n            </SelectItem>\n          ))}\n        </SelectGroup>\n      </SelectContent>\n    </Select>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/separator.tsx",
    "content": "import { Separator } from '@/registry/nativewind/components/ui/separator';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport { View } from 'react-native';\n\nexport function SeparatorPreview() {\n  return (\n    <View>\n      <View className=\"gap-1\">\n        <Text className=\"text-sm font-medium leading-none\">Radix Primitives</Text>\n        <Text className=\"text-muted-foreground text-sm\">An open-source UI component library.</Text>\n      </View>\n      <Separator className=\"my-4\" />\n      <View className=\"flex h-5 flex-row items-center gap-4\">\n        <Text className=\"text-sm\">Blog</Text>\n        <Separator orientation=\"vertical\" />\n        <Text className=\"text-sm\">Docs</Text>\n        <Separator orientation=\"vertical\" />\n        <Text className=\"text-sm\">Source</Text>\n      </View>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/skeleton.tsx",
    "content": "import { Skeleton } from '@/registry/nativewind/components/ui/skeleton';\nimport { View } from 'react-native';\n\nexport function SkeletonPreview() {\n  return (\n    <View className=\"flex flex-row items-center gap-4\">\n      <Skeleton className=\"h-12 w-12 rounded-full\" />\n      <View className=\"gap-2\">\n        <Skeleton className=\"h-4 w-[250px]\" />\n        <Skeleton className=\"h-4 w-[200px]\" />\n      </View>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/switch.tsx",
    "content": "import { Label } from '@/registry/nativewind/components/ui/label';\nimport { Switch } from '@/registry/nativewind/components/ui/switch';\nimport * as Haptics from 'expo-haptics';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport function SwitchPreview() {\n  const [checked, setChecked] = React.useState(false);\n\n  function onPress() {\n    Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n    setChecked((prev) => !prev);\n  }\n\n  function onCheckedChange(checked: boolean) {\n    Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n    setChecked(checked);\n  }\n\n  return (\n    <View className=\"flex-row items-center gap-2\">\n      <Switch\n        checked={checked}\n        onCheckedChange={onCheckedChange}\n        id=\"airplane-mode\"\n        nativeID=\"airplane-mode\"\n      />\n      <Label nativeID=\"airplane-mode\" htmlFor=\"airplane-mode\" onPress={onPress}>\n        Airplane Mode\n      </Label>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/tabs.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport {\n  Card,\n  CardContent,\n  CardDescription,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n} from '@/registry/nativewind/components/ui/card';\nimport { Input } from '@/registry/nativewind/components/ui/input';\nimport { Label } from '@/registry/nativewind/components/ui/label';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/registry/nativewind/components/ui/tabs';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport * as React from 'react';\nimport { View } from 'react-native';\n\nexport function TabsPreview() {\n  const [value, setValue] = React.useState('feedback');\n  return (\n    <View className=\"flex w-full max-w-sm flex-col gap-6\">\n      <Tabs value={value} onValueChange={setValue}>\n        <TabsList>\n          <TabsTrigger value=\"feedback\">\n            <Text>Feedback</Text>\n          </TabsTrigger>\n          <TabsTrigger value=\"survey\">\n            <Text>Survey</Text>\n          </TabsTrigger>\n        </TabsList>\n\n        <TabsContent value=\"feedback\">\n          <Card>\n            <CardHeader>\n              <CardTitle>Feedback</CardTitle>\n              <CardDescription>\n                Share your thoughts with us. Click submit when you’re ready.\n              </CardDescription>\n            </CardHeader>\n            <CardContent className=\"gap-6\">\n              <View className=\"gap-3\">\n                <Label htmlFor=\"tabs-demo-name\">Name</Label>\n                <Input id=\"tabs-demo-name\" defaultValue=\"Michael Scott\" />\n              </View>\n              <View className=\"gap-3\">\n                <Label htmlFor=\"tabs-demo-message\">Message</Label>\n                <Input id=\"tabs-demo-message\" defaultValue=\"Where are the turtles?!\" />\n              </View>\n            </CardContent>\n            <CardFooter>\n              <Button>\n                <Text>Submit feedback</Text>\n              </Button>\n            </CardFooter>\n          </Card>\n        </TabsContent>\n\n        <TabsContent value=\"survey\">\n          <Card>\n            <CardHeader>\n              <CardTitle>Quick Survey</CardTitle>\n              <CardDescription>\n                Answer a few quick questions to help improve the demo.\n              </CardDescription>\n            </CardHeader>\n            <CardContent className=\"gap-6\">\n              <View className=\"gap-3\">\n                <Label htmlFor=\"tabs-demo-job-title\">Job Title</Label>\n                <Input id=\"tabs-demo-job-title\" defaultValue=\"Regional Manager\" />\n              </View>\n              <View className=\"gap-3\">\n                <Label htmlFor=\"tabs-demo-favorite\">Favorite feature</Label>\n                <Input id=\"tabs-demo-favorite\" defaultValue=\"CLI\" />\n              </View>\n            </CardContent>\n            <CardFooter>\n              <Button>\n                <Text>Submit survey</Text>\n              </Button>\n            </CardFooter>\n          </Card>\n        </TabsContent>\n      </Tabs>\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/text/index.ts",
    "content": "export * from './text';\nexport * from './text-cascade';\nexport * from './text-typorgaphy';\n"
  },
  {
    "path": "packages/registry/src/examples/text/text-cascade.tsx",
    "content": "import { Text, TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { View } from 'react-native';\n\nexport function TextCascadePreview() {\n  return (\n    <View className=\"items-center gap-2\">\n      {/* Default behavior without a parent `TextClassContext.Provider` */}\n      <Text>\n        Default: <Text variant=\"code\">text-foreground</Text>\n      </Text>\n      <Parent>\n        {/* Inherits the `TextClassContext.Provider` value from the `Parent` component and overrides the default `Text` component `className` */}\n        <Text>\n          Inherited from Parent: <Text variant=\"code\">text-emerald-500</Text>\n        </Text>\n        <Text>\n          {/* This `className` will override the `TextClassContext.Provider` value */}\n          <Text className=\"text-purple-500\">Overridden:</Text>{' '}\n          <Text variant=\"code\" className=\"text-purple-500\">\n            text-purple-500\n          </Text>\n        </Text>\n        <NestedParent>\n          {/* Inherits the `TextClassContext.Provider` value from the `OtherParent` component overrides the `TextClassContext.Provider` value from the `Parent` */}\n          <Text>\n            Inherited from NestedParent: <Text variant=\"code\">text-sky-500</Text>\n          </Text>\n        </NestedParent>\n      </Parent>\n    </View>\n  );\n}\n\n// Parent component that provides a `TextClassContext.Provider` value\nfunction Parent({ children }: React.ComponentProps<typeof View>) {\n  return (\n    <TextClassContext.Provider value=\"text-emerald-500\">\n      <View className=\"items-center gap-2\">{children}</View>\n    </TextClassContext.Provider>\n  );\n}\n\n// Nested parent component that overrides the `TextClassContext.Provider` value from the `Parent` component\nfunction NestedParent({ children }: React.ComponentProps<typeof View>) {\n  return (\n    <TextClassContext.Provider value=\"text-sky-500\">\n      <View className=\"items-center gap-2\">{children}</View>\n    </TextClassContext.Provider>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/text/text-typorgaphy.tsx",
    "content": "import { ScrollView, View } from 'react-native';\nimport { Text } from '@/registry/nativewind/components/ui/text';\n\nexport function TextTypographyPreview() {\n  return (\n    <ScrollView contentContainerClassName=\"p-6 native:pb-safe\">\n      <View className=\"native:pb-12 max-w-lg\">\n        <Text variant=\"h1\">The Rainbow Forest Adventure</Text>\n        <View className=\"p-1.5\" />\n        <Text variant=\"p\">\n          Once upon a time, in a magical forest, there lived a curious rabbit named Whiskers.\n          Whiskers loved exploring and discovering new things every day.\n        </Text>\n        <View className=\"p-3\" />\n        <Text variant=\"h2\">Whiskers' Discovery</Text>\n        <Text variant=\"p\">\n          One day, while hopping through the forest, Whiskers stumbled upon{' '}\n          <Text variant=\"p\" className=\"font-medium\">\n            a mysterious rainbow-colored flower\n          </Text>\n          . The flower had the power to make the forest come alive with vibrant colors and happy\n          creatures.\n        </Text>\n        <Text variant=\"blockquote\">\n          \"Oh, what a wonderful discovery!\" exclaimed Whiskers. \"I must share this magic with all my\n          forest friends!\"\n        </Text>\n        <View className=\"p-4\" />\n        <Text variant=\"h3\">The Colorful Transformation</Text>\n        <View className=\"p-0.5\" />\n        <Text variant=\"p\">\n          Whiskers excitedly gathered all the animals in the forest and showed them the magical\n          rainbow flower. The animals were amazed and decided to plant more of these flowers to make\n          their home even more magical.\n        </Text>\n        <View className=\"p-1.5\" />\n        <Text variant=\"p\">\n          As the rainbow flowers bloomed, the entire forest transformed into a kaleidoscope of\n          colors. Birds chirped in harmony, butterflies danced in the air, and even the trees swayed\n          to the rhythm of the wind.\n        </Text>\n        <View className=\"p-3\" />\n        <Text variant=\"h3\">The Enchanted Celebration</Text>\n        <View className=\"p-0.5\" />\n        <Text variant=\"p\">\n          The animals decided to celebrate their enchanted forest with a grand feast. They gathered\n          nuts, berries, and fruits from the colorful trees and shared stories of their adventures.\n          The joyous laughter echoed through the Rainbow Forest.\n        </Text>\n        <View className=\"p-1.5\" />\n        <Text variant=\"lead\">\n          And so, the Rainbow Forest became a place of wonder and happiness, where Whiskers and all\n          the animals lived together in harmony.\n        </Text>\n        <View className=\"p-3\" />\n        <Text variant=\"h3\">The Never-ending Magic</Text>\n        <View className=\"p-0.5\" />\n        <Text variant=\"p\">\n          The magic of the rainbow flowers continued to spread, reaching other parts of the world.\n          Soon, forests everywhere became vibrant and alive, thanks to the discovery of Whiskers and\n          the enchanted Rainbow Forest.\n        </Text>\n        <View className=\"p-1.5\" />\n        <Text variant=\"large\">\n          The moral of the story is: embrace the magic of discovery, share joy with others, and\n          watch as the world transforms into a colorful and beautiful place.\n        </Text>\n        <View className=\"p-3\" />\n      </View>\n    </ScrollView>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/text/text.tsx",
    "content": "import { Text } from '@/registry/nativewind/components/ui/text';\n\nexport function TextPreview() {\n  return <Text>Hello, world!</Text>;\n}\n"
  },
  {
    "path": "packages/registry/src/examples/textarea.tsx",
    "content": "import { Textarea } from '@/registry/nativewind/components/ui/textarea';\n\nexport function TextareaPreview() {\n  return <Textarea placeholder=\"Type your message here.\" className=\"max-w-md\" />;\n}\n"
  },
  {
    "path": "packages/registry/src/examples/toggle-group.tsx",
    "content": "import { Bold, Italic, Underline } from 'lucide-react-native';\nimport {\n  ToggleGroup,\n  ToggleGroupIcon,\n  ToggleGroupItem,\n} from '@/registry/nativewind/components/ui/toggle-group';\nimport * as React from 'react';\nimport * as Haptics from 'expo-haptics';\n\nexport function ToggleGroupPreview() {\n  const [value, setValue] = React.useState<string[]>([]);\n\n  function onValueChange(value: string[]) {\n    Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n    setValue(value);\n  }\n\n  return (\n    <ToggleGroup value={value} onValueChange={onValueChange} variant=\"outline\" type=\"multiple\">\n      <ToggleGroupItem isFirst value=\"bold\" aria-label=\"Toggle bold\">\n        <ToggleGroupIcon as={Bold} />\n      </ToggleGroupItem>\n      <ToggleGroupItem value=\"italic\" aria-label=\"Toggle italic\">\n        <ToggleGroupIcon as={Italic} />\n      </ToggleGroupItem>\n      <ToggleGroupItem isLast value=\"strikethrough\" aria-label=\"Toggle strikethrough\">\n        <ToggleGroupIcon as={Underline} />\n      </ToggleGroupItem>\n    </ToggleGroup>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/toggle.tsx",
    "content": "import { Toggle, ToggleIcon } from '@/registry/nativewind/components/ui/toggle';\nimport { Bold } from 'lucide-react-native';\nimport * as React from 'react';\nimport * as Haptics from 'expo-haptics';\n\nexport function TogglePreview() {\n  const [pressed, setPressed] = React.useState(false);\n\n  function onPressedChange(pressed: boolean) {\n    Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n    setPressed(pressed);\n  }\n\n  return (\n    <Toggle aria-label=\"Toggle italic\" pressed={pressed} onPressedChange={onPressedChange}>\n      <ToggleIcon as={Bold} />\n    </Toggle>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/examples/tooltip.tsx",
    "content": "import { Button } from '@/registry/nativewind/components/ui/button';\nimport { Text } from '@/registry/nativewind/components/ui/text';\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipTrigger,\n} from '@/registry/nativewind/components/ui/tooltip';\nimport { Platform } from 'react-native';\n\nexport function TooltipPreview() {\n  return (\n    <Tooltip>\n      <TooltipTrigger asChild>\n        <Button variant=\"outline\">\n          <Text>{Platform.select({ web: 'Hover', default: 'Press' })}</Text>\n        </Button>\n      </TooltipTrigger>\n      <TooltipContent>\n        <Text>Add to library</Text>\n      </TooltipContent>\n    </Tooltip>\n  );\n}\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/accordion.tsx",
    "content": "import { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as AccordionPrimitive from '@rn-primitives/accordion';\nimport { ChevronDown } from 'lucide-react-native';\nimport { Platform, Pressable, View } from 'react-native';\nimport Animated, {\n  FadeOutUp,\n  LayoutAnimationConfig,\n  LinearTransition,\n  useAnimatedStyle,\n  useDerivedValue,\n  withTiming,\n} from 'react-native-reanimated';\n\nfunction Accordion({\n  children,\n  ...props\n}: Omit<AccordionPrimitive.RootProps, 'asChild'> &\n  React.RefAttributes<AccordionPrimitive.RootRef>) {\n  return (\n    <LayoutAnimationConfig skipEntering>\n      <AccordionPrimitive.Root\n        {...(props as AccordionPrimitive.RootProps)}\n        asChild={Platform.OS !== 'web'}>\n        <Animated.View layout={LinearTransition.duration(200)}>{children}</Animated.View>\n      </AccordionPrimitive.Root>\n    </LayoutAnimationConfig>\n  );\n}\n\nfunction AccordionItem({\n  children,\n  className,\n  value,\n  ...props\n}: AccordionPrimitive.ItemProps & React.RefAttributes<AccordionPrimitive.ItemRef>) {\n  return (\n    <AccordionPrimitive.Item\n      className={cn(\n        'border-border border-b',\n        Platform.select({ web: 'last:border-b-0' }),\n        className\n      )}\n      value={value}\n      asChild={Platform.OS !== 'web'}\n      {...props}>\n      <Animated.View\n        className=\"native:overflow-hidden\"\n        layout={Platform.select({ native: LinearTransition.duration(200) })}>\n        {children}\n      </Animated.View>\n    </AccordionPrimitive.Item>\n  );\n}\n\nconst Trigger = Platform.OS === 'web' ? View : Pressable;\n\nfunction AccordionTrigger({\n  className,\n  children,\n  ...props\n}: AccordionPrimitive.TriggerProps & {\n  children?: React.ReactNode;\n} & React.RefAttributes<AccordionPrimitive.TriggerRef>) {\n  const { isExpanded } = AccordionPrimitive.useItemContext();\n\n  const progress = useDerivedValue(\n    () => (isExpanded ? withTiming(1, { duration: 250 }) : withTiming(0, { duration: 200 })),\n    [isExpanded]\n  );\n  const chevronStyle = useAnimatedStyle(\n    () => ({\n      transform: [{ rotate: `${progress.value * 180}deg` }],\n    }),\n    [progress]\n  );\n\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-left text-sm font-medium',\n        Platform.select({ web: 'group-hover:underline' })\n      )}>\n      <AccordionPrimitive.Header>\n        <AccordionPrimitive.Trigger {...props} asChild>\n          <Trigger\n            className={cn(\n              'flex-row items-start justify-between gap-4 rounded-md py-4 disabled:opacity-50',\n              Platform.select({\n                web: 'focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 outline-none transition-all hover:underline focus-visible:ring-[3px] disabled:pointer-events-none [&[data-state=open]>svg]:rotate-180',\n              }),\n              className\n            )}>\n            <>{children}</>\n            <Animated.View style={chevronStyle}>\n              <Icon\n                as={ChevronDown}\n                size={16}\n                className={cn(\n                  'text-muted-foreground shrink-0',\n                  Platform.select({\n                    web: 'pointer-events-none translate-y-0.5 transition-transform duration-200',\n                  })\n                )}\n              />\n            </Animated.View>\n          </Trigger>\n        </AccordionPrimitive.Trigger>\n      </AccordionPrimitive.Header>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction AccordionContent({\n  className,\n  children,\n  ...props\n}: AccordionPrimitive.ContentProps & React.RefAttributes<AccordionPrimitive.ContentRef>) {\n  const { isExpanded } = AccordionPrimitive.useItemContext();\n  return (\n    <TextClassContext.Provider value=\"text-sm\">\n      <AccordionPrimitive.Content\n        className={cn(\n          'overflow-hidden',\n          Platform.select({\n            web: isExpanded ? 'animate-accordion-down' : 'animate-accordion-up',\n          })\n        )}\n        {...props}>\n        <Animated.View\n          exiting={Platform.select({ native: FadeOutUp.duration(200) })}\n          className={cn('pb-4', className)}>\n          {children}\n        </Animated.View>\n      </AccordionPrimitive.Content>\n    </TextClassContext.Provider>\n  );\n}\n\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/alert-dialog.tsx",
    "content": "import { buttonTextVariants, buttonVariants } from '@/registry/nativewind/components/ui/button';\nimport { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as AlertDialogPrimitive from '@rn-primitives/alert-dialog';\nimport * as React from 'react';\nimport { Platform, View, type ViewProps } from 'react-native';\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst AlertDialog = AlertDialogPrimitive.Root;\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction AlertDialogOverlay({\n  className,\n  children,\n  ...props\n}: Omit<AlertDialogPrimitive.OverlayProps, 'asChild'> &\n  React.RefAttributes<AlertDialogPrimitive.OverlayRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <FullWindowOverlay>\n      <AlertDialogPrimitive.Overlay\n        className={cn(\n          'absolute bottom-0 left-0 right-0 top-0 z-50 flex items-center justify-center bg-black/50 p-2',\n          Platform.select({\n            web: 'animate-in fade-in-0 fixed',\n          }),\n          className\n        )}\n        {...props}>\n        <NativeOnlyAnimatedView\n          entering={FadeIn.duration(200).delay(50)}\n          exiting={FadeOut.duration(150)}>\n          <>{children}</>\n        </NativeOnlyAnimatedView>\n      </AlertDialogPrimitive.Overlay>\n    </FullWindowOverlay>\n  );\n}\n\nfunction AlertDialogContent({\n  className,\n  portalHost,\n  ...props\n}: AlertDialogPrimitive.ContentProps &\n  React.RefAttributes<AlertDialogPrimitive.ContentRef> & {\n    portalHost?: string;\n  }) {\n  return (\n    <AlertDialogPortal hostName={portalHost}>\n      <AlertDialogOverlay>\n        <AlertDialogPrimitive.Content\n          className={cn(\n            'bg-background border-border z-50 flex w-full max-w-[calc(100%-2rem)] flex-col gap-4 rounded-lg border p-6 shadow-lg shadow-black/5 sm:max-w-lg',\n            Platform.select({\n              web: 'animate-in fade-in-0 zoom-in-95 duration-200',\n            }),\n            className\n          )}\n          {...props}\n        />\n      </AlertDialogOverlay>\n    </AlertDialogPortal>\n  );\n}\n\nfunction AlertDialogHeader({ className, ...props }: ViewProps) {\n  return (\n    <TextClassContext.Provider value=\"text-center sm:text-left\">\n      <View className={cn('flex flex-col gap-2', className)} {...props} />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction AlertDialogFooter({ className, ...props }: ViewProps) {\n  return (\n    <View\n      className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n      {...props}\n    />\n  );\n}\n\nfunction AlertDialogTitle({\n  className,\n  ...props\n}: AlertDialogPrimitive.TitleProps & React.RefAttributes<AlertDialogPrimitive.TitleRef>) {\n  return (\n    <AlertDialogPrimitive.Title\n      className={cn('text-foreground text-lg font-semibold', className)}\n      {...props}\n    />\n  );\n}\n\nfunction AlertDialogDescription({\n  className,\n  ...props\n}: AlertDialogPrimitive.DescriptionProps &\n  React.RefAttributes<AlertDialogPrimitive.DescriptionRef>) {\n  return (\n    <AlertDialogPrimitive.Description\n      className={cn('text-muted-foreground text-sm', className)}\n      {...props}\n    />\n  );\n}\n\nfunction AlertDialogAction({\n  className,\n  ...props\n}: AlertDialogPrimitive.ActionProps & React.RefAttributes<AlertDialogPrimitive.ActionRef>) {\n  return (\n    <TextClassContext.Provider value={buttonTextVariants({ className })}>\n      <AlertDialogPrimitive.Action className={cn(buttonVariants(), className)} {...props} />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction AlertDialogCancel({\n  className,\n  ...props\n}: AlertDialogPrimitive.CancelProps & React.RefAttributes<AlertDialogPrimitive.CancelRef>) {\n  return (\n    <TextClassContext.Provider value={buttonTextVariants({ className, variant: 'outline' })}>\n      <AlertDialogPrimitive.Cancel\n        className={cn(buttonVariants({ variant: 'outline' }), className)}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nexport {\n  AlertDialog,\n  AlertDialogAction,\n  AlertDialogCancel,\n  AlertDialogContent,\n  AlertDialogDescription,\n  AlertDialogFooter,\n  AlertDialogHeader,\n  AlertDialogOverlay,\n  AlertDialogPortal,\n  AlertDialogTitle,\n  AlertDialogTrigger,\n};\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/alert.tsx",
    "content": "import { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { Text, TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport type { LucideIcon } from 'lucide-react-native';\nimport * as React from 'react';\nimport { View, type ViewProps } from 'react-native';\n\nfunction Alert({\n  className,\n  variant,\n  children,\n  icon,\n  iconClassName,\n  ...props\n}: ViewProps &\n  React.RefAttributes<View> & {\n    icon: LucideIcon;\n    variant?: 'default' | 'destructive';\n    iconClassName?: string;\n  }) {\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm text-foreground',\n        variant === 'destructive' && 'text-destructive',\n        className\n      )}>\n      <View\n        role=\"alert\"\n        className={cn(\n          'bg-card border-border relative w-full rounded-lg border px-4 pb-2 pt-3.5',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-3.5 top-3\">\n          <Icon\n            as={icon}\n            className={cn('size-4', variant === 'destructive' && 'text-destructive', iconClassName)}\n          />\n        </View>\n        {children}\n      </View>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction AlertTitle({\n  className,\n  ...props\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\n  return (\n    <Text\n      className={cn('mb-1 ml-0.5 min-h-4 pl-6 font-medium leading-none tracking-tight', className)}\n      {...props}\n    />\n  );\n}\n\nfunction AlertDescription({\n  className,\n  ...props\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\n  const textClass = React.useContext(TextClassContext);\n  return (\n    <Text\n      className={cn(\n        'text-muted-foreground ml-0.5 pb-1.5 pl-6 text-sm leading-relaxed',\n        textClass?.includes('text-destructive') && 'text-destructive/90',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nexport { Alert, AlertDescription, AlertTitle };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/aspect-ratio.tsx",
    "content": "import * as AspectRatioPrimitive from '@rn-primitives/aspect-ratio';\n\nconst AspectRatio = AspectRatioPrimitive.Root;\n\nexport { AspectRatio };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/avatar.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport * as AvatarPrimitive from '@rn-primitives/avatar';\n\nfunction Avatar({\n  className,\n  ...props\n}: AvatarPrimitive.RootProps & React.RefAttributes<AvatarPrimitive.RootRef>) {\n  return (\n    <AvatarPrimitive.Root\n      className={cn('relative flex size-8 shrink-0 overflow-hidden rounded-full', className)}\n      {...props}\n    />\n  );\n}\n\nfunction AvatarImage({\n  className,\n  ...props\n}: AvatarPrimitive.ImageProps & React.RefAttributes<AvatarPrimitive.ImageRef>) {\n  return <AvatarPrimitive.Image className={cn('aspect-square size-full', className)} {...props} />;\n}\n\nfunction AvatarFallback({\n  className,\n  ...props\n}: AvatarPrimitive.FallbackProps & React.RefAttributes<AvatarPrimitive.FallbackRef>) {\n  return (\n    <AvatarPrimitive.Fallback\n      className={cn(\n        'bg-muted flex size-full flex-row items-center justify-center rounded-full',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nexport { Avatar, AvatarFallback, AvatarImage };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/badge.tsx",
    "content": "import { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as Slot from '@rn-primitives/slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Platform, View, ViewProps } from 'react-native';\n\nconst badgeVariants = cva(\n  cn(\n    'border-border group shrink-0 flex-row items-center justify-center gap-1 overflow-hidden rounded-full border px-2 py-0.5',\n    Platform.select({\n      web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive w-fit whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] [&>svg]:pointer-events-none [&>svg]:size-3',\n    })\n  ),\n  {\n    variants: {\n      variant: {\n        default: cn(\n          'bg-primary border-transparent',\n          Platform.select({ web: '[a&]:hover:bg-primary/90' })\n        ),\n        secondary: cn(\n          'bg-secondary border-transparent',\n          Platform.select({ web: '[a&]:hover:bg-secondary/90' })\n        ),\n        destructive: cn(\n          'bg-destructive border-transparent',\n          Platform.select({ web: '[a&]:hover:bg-destructive/90' })\n        ),\n        outline: Platform.select({ web: '[a&]:hover:bg-accent [a&]:hover:text-accent-foreground' }),\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n    },\n  }\n);\n\nconst badgeTextVariants = cva('text-xs font-medium', {\n  variants: {\n    variant: {\n      default: 'text-primary-foreground',\n      secondary: 'text-secondary-foreground',\n      destructive: 'text-white',\n      outline: 'text-foreground',\n    },\n  },\n  defaultVariants: {\n    variant: 'default',\n  },\n});\n\ntype BadgeProps = ViewProps &\n  React.RefAttributes<View> & {\n    asChild?: boolean;\n  } & VariantProps<typeof badgeVariants>;\n\nfunction Badge({ className, variant, asChild, ...props }: BadgeProps) {\n  const Component = asChild ? Slot.View : View;\n  return (\n    <TextClassContext.Provider value={badgeTextVariants({ variant })}>\n      <Component className={cn(badgeVariants({ variant }), className)} {...props} />\n    </TextClassContext.Provider>\n  );\n}\n\nexport { Badge, badgeTextVariants, badgeVariants };\nexport type { BadgeProps };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/button.tsx",
    "content": "import { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Platform, Pressable } from 'react-native';\n\nconst buttonVariants = cva(\n  cn(\n    'group shrink-0 flex-row items-center justify-center gap-2 rounded-md shadow-none',\n    Platform.select({\n      web: \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap outline-none transition-all focus-visible:ring-[3px] disabled:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n    })\n  ),\n  {\n    variants: {\n      variant: {\n        default: cn(\n          'bg-primary active:bg-primary/90 shadow-sm shadow-black/5',\n          Platform.select({ web: 'hover:bg-primary/90' })\n        ),\n        destructive: cn(\n          'bg-destructive active:bg-destructive/90 dark:bg-destructive/60 shadow-sm shadow-black/5',\n          Platform.select({\n            web: 'hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',\n          })\n        ),\n        outline: cn(\n          'border-border bg-background active:bg-accent dark:bg-input/30 dark:border-input dark:active:bg-input/50 border shadow-sm shadow-black/5',\n          Platform.select({\n            web: 'hover:bg-accent dark:hover:bg-input/50',\n          })\n        ),\n        secondary: cn(\n          'bg-secondary active:bg-secondary/80 shadow-sm shadow-black/5',\n          Platform.select({ web: 'hover:bg-secondary/80' })\n        ),\n        ghost: cn(\n          'active:bg-accent dark:active:bg-accent/50',\n          Platform.select({ web: 'hover:bg-accent dark:hover:bg-accent/50' })\n        ),\n        link: '',\n      },\n      size: {\n        default: cn('h-10 px-4 py-2 sm:h-9', Platform.select({ web: 'has-[>svg]:px-3' })),\n        sm: cn('h-9 gap-1.5 rounded-md px-3 sm:h-8', Platform.select({ web: 'has-[>svg]:px-2.5' })),\n        lg: cn('h-11 rounded-md px-6 sm:h-10', Platform.select({ web: 'has-[>svg]:px-4' })),\n        icon: 'h-10 w-10 sm:h-9 sm:w-9',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n);\n\nconst buttonTextVariants = cva(\n  cn(\n    'text-foreground text-sm font-medium',\n    Platform.select({ web: 'pointer-events-none transition-colors' })\n  ),\n  {\n    variants: {\n      variant: {\n        default: 'text-primary-foreground',\n        destructive: 'text-white',\n        outline: cn(\n          'group-active:text-accent-foreground',\n          Platform.select({ web: 'group-hover:text-accent-foreground' })\n        ),\n        secondary: 'text-secondary-foreground',\n        ghost: 'group-active:text-accent-foreground',\n        link: cn(\n          'text-primary group-active:underline',\n          Platform.select({ web: 'underline-offset-4 hover:underline group-hover:underline' })\n        ),\n      },\n      size: {\n        default: '',\n        sm: '',\n        lg: '',\n        icon: '',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n);\n\ntype ButtonProps = React.ComponentProps<typeof Pressable> &\n  React.RefAttributes<typeof Pressable> &\n  VariantProps<typeof buttonVariants>;\n\nfunction Button({ className, variant, size, ...props }: ButtonProps) {\n  return (\n    <TextClassContext.Provider value={buttonTextVariants({ variant, size })}>\n      <Pressable\n        className={cn(props.disabled && 'opacity-50', buttonVariants({ variant, size }), className)}\n        role=\"button\"\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nexport { Button, buttonTextVariants, buttonVariants };\nexport type { ButtonProps };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/card.tsx",
    "content": "import { Text, TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport { View, type ViewProps } from 'react-native';\n\nfunction Card({ className, ...props }: ViewProps & React.RefAttributes<View>) {\n  return (\n    <TextClassContext.Provider value=\"text-card-foreground\">\n      <View\n        className={cn(\n          'bg-card border-border flex flex-col gap-6 rounded-xl border py-6 shadow-sm shadow-black/5',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction CardHeader({ className, ...props }: ViewProps & React.RefAttributes<View>) {\n  return <View className={cn('flex flex-col gap-1.5 px-6', className)} {...props} />;\n}\n\nfunction CardTitle({\n  className,\n  ...props\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\n  return (\n    <Text\n      role=\"heading\"\n      aria-level={3}\n      className={cn('font-semibold leading-none', className)}\n      {...props}\n    />\n  );\n}\n\nfunction CardDescription({\n  className,\n  ...props\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\n  return <Text className={cn('text-muted-foreground text-sm', className)} {...props} />;\n}\n\nfunction CardContent({ className, ...props }: ViewProps & React.RefAttributes<View>) {\n  return <View className={cn('px-6', className)} {...props} />;\n}\n\nfunction CardFooter({ className, ...props }: ViewProps & React.RefAttributes<View>) {\n  return <View className={cn('flex flex-row items-center px-6', className)} {...props} />;\n}\n\nexport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/checkbox.tsx",
    "content": "import { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as CheckboxPrimitive from '@rn-primitives/checkbox';\nimport { Check } from 'lucide-react-native';\nimport { Platform } from 'react-native';\n\nconst DEFAULT_HIT_SLOP = 24;\n\nfunction Checkbox({\n  className,\n  checkedClassName,\n  indicatorClassName,\n  iconClassName,\n  ...props\n}: CheckboxPrimitive.RootProps &\n  React.RefAttributes<CheckboxPrimitive.RootRef> & {\n    checkedClassName?: string;\n    indicatorClassName?: string;\n    iconClassName?: string;\n  }) {\n  return (\n    <CheckboxPrimitive.Root\n      className={cn(\n        'border-input dark:bg-input/30 size-4 shrink-0 rounded-[4px] border shadow-sm shadow-black/5',\n        Platform.select({\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive peer cursor-default outline-none transition-shadow focus-visible:ring-[3px] disabled:cursor-not-allowed',\n          native: 'overflow-hidden',\n        }),\n        props.checked && cn('border-primary', checkedClassName),\n        props.disabled && 'opacity-50',\n        className\n      )}\n      hitSlop={DEFAULT_HIT_SLOP}\n      {...props}>\n      <CheckboxPrimitive.Indicator\n        className={cn('bg-primary h-full w-full items-center justify-center', indicatorClassName)}>\n        <Icon\n          as={Check}\n          size={12}\n          strokeWidth={Platform.OS === 'web' ? 2.5 : 3.5}\n          className={cn('text-primary-foreground', iconClassName)}\n        />\n      </CheckboxPrimitive.Indicator>\n    </CheckboxPrimitive.Root>\n  );\n}\n\nexport { Checkbox };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/collapsible.tsx",
    "content": "import * as CollapsiblePrimitive from '@rn-primitives/collapsible';\n\nconst Collapsible = CollapsiblePrimitive.Root;\n\nconst CollapsibleTrigger = CollapsiblePrimitive.Trigger;\n\nconst CollapsibleContent = CollapsiblePrimitive.Content;\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/context-menu.tsx",
    "content": "import { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as ContextMenuPrimitive from '@rn-primitives/context-menu';\nimport { Check, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react-native';\nimport * as React from 'react';\nimport {\n  Platform,\n  type StyleProp,\n  StyleSheet,\n  Text,\n  type TextProps,\n  View,\n  type ViewStyle,\n} from 'react-native';\nimport { FadeIn } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst ContextMenu = ContextMenuPrimitive.Root;\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger;\nconst ContextMenuGroup = ContextMenuPrimitive.Group;\nconst ContextMenuSub = ContextMenuPrimitive.Sub;\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;\n\nfunction ContextMenuSubTrigger({\n  className,\n  inset,\n  children,\n  iconClassName,\n  ...props\n}: ContextMenuPrimitive.SubTriggerProps &\n  React.RefAttributes<ContextMenuPrimitive.SubTriggerRef> & {\n    children?: React.ReactNode;\n    iconClassName?: string;\n    inset?: boolean;\n  }) {\n  const { open } = ContextMenuPrimitive.useSubContext();\n  const icon = Platform.OS === 'web' ? ChevronRight : open ? ChevronUp : ChevronDown;\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm select-none group-active:text-accent-foreground',\n        open && 'text-accent-foreground'\n      )}>\n      <ContextMenuPrimitive.SubTrigger\n        className={cn(\n          'active:bg-accent group flex flex-row items-center rounded-sm px-2 py-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none [&_svg]:pointer-events-none',\n          }),\n          className,\n          open && cn('bg-accent', Platform.select({ native: 'mb-1' })),\n          inset && 'pl-8'\n        )}\n        {...props}>\n        <>{children}</>\n        <Icon as={icon} className={cn('text-foreground ml-auto size-4 shrink-0', iconClassName)} />\n      </ContextMenuPrimitive.SubTrigger>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction ContextMenuSubContent({\n  className,\n  ...props\n}: ContextMenuPrimitive.SubContentProps & React.RefAttributes<ContextMenuPrimitive.SubContentRef>) {\n  return (\n    <NativeOnlyAnimatedView entering={FadeIn}>\n      <ContextMenuPrimitive.SubContent\n        className={cn(\n          'bg-popover border-border overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\n          Platform.select({\n            web: 'animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fade-in-0 data-[state=closed]:zoom-out-95 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 origin-(--radix-context-menu-content-transform-origin) z-50 min-w-[8rem]',\n          }),\n          className\n        )}\n        {...props}\n      />\n    </NativeOnlyAnimatedView>\n  );\n}\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction ContextMenuContent({\n  className,\n  overlayClassName,\n  overlayStyle,\n  portalHost,\n  ...props\n}: ContextMenuPrimitive.ContentProps &\n  React.RefAttributes<ContextMenuPrimitive.ContentRef> & {\n    overlayStyle?: StyleProp<ViewStyle>;\n    overlayClassName?: string;\n    portalHost?: string;\n  }) {\n  return (\n    <ContextMenuPrimitive.Portal hostName={portalHost}>\n      <FullWindowOverlay>\n        <ContextMenuPrimitive.Overlay\n          style={Platform.select({\n            web: overlayStyle ?? undefined,\n            native: overlayStyle\n              ? StyleSheet.flatten([\n                StyleSheet.absoluteFill,\n                overlayStyle as typeof StyleSheet.absoluteFill,\n              ])\n              : StyleSheet.absoluteFill,\n          })}\n          className={overlayClassName}>\n          <NativeOnlyAnimatedView entering={FadeIn}>\n            <TextClassContext.Provider value=\"text-popover-foreground\">\n              <ContextMenuPrimitive.Content\n                className={cn(\n                  'bg-popover border-border min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\n                  Platform.select({\n                    web: cn(\n                      'animate-in fade-in-0 zoom-in-95 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) z-50 cursor-default',\n                      props.side === 'bottom' && 'slide-in-from-top-2',\n                      props.side === 'top' && 'slide-in-from-bottom-2'\n                    ),\n                  }),\n                  className\n                )}\n                {...props}\n              />\n            </TextClassContext.Provider>\n          </NativeOnlyAnimatedView>\n        </ContextMenuPrimitive.Overlay>\n      </FullWindowOverlay>\n    </ContextMenuPrimitive.Portal>\n  );\n}\n\nfunction ContextMenuItem({\n  className,\n  inset,\n  variant,\n  ...props\n}: ContextMenuPrimitive.ItemProps &\n  React.RefAttributes<ContextMenuPrimitive.ItemRef> & {\n    className?: string;\n    inset?: boolean;\n    variant?: 'default' | 'destructive';\n  }) {\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'select-none text-sm text-popover-foreground group-active:text-popover-foreground',\n        variant === 'destructive' && 'text-destructive group-active:text-destructive'\n      )}>\n      <ContextMenuPrimitive.Item\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm px-2 py-2 sm:py-1.5',\n          Platform.select({\n            web: cn(\n              'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n              variant === 'destructive' && 'focus:bg-destructive/10 dark:focus:bg-destructive/20'\n            ),\n          }),\n          variant === 'destructive' && 'active:bg-destructive/10 dark:active:bg-destructive/20',\n          props.disabled && 'opacity-50',\n          inset && 'pl-8',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction ContextMenuCheckboxItem({\n  className,\n  children,\n  ...props\n}: ContextMenuPrimitive.CheckboxItemProps &\n  React.RefAttributes<ContextMenuPrimitive.CheckboxItemRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <TextClassContext.Provider value=\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\">\n      <ContextMenuPrimitive.CheckboxItem\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n          }),\n          props.disabled && 'opacity-50',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n          <ContextMenuPrimitive.ItemIndicator>\n            <Icon\n              as={Check}\n              className={cn(\n                'text-foreground size-4',\n                Platform.select({ web: 'pointer-events-none' })\n              )}\n            />\n          </ContextMenuPrimitive.ItemIndicator>\n        </View>\n        <>{children}</>\n      </ContextMenuPrimitive.CheckboxItem>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction ContextMenuRadioItem({\n  className,\n  children,\n  ...props\n}: ContextMenuPrimitive.RadioItemProps &\n  React.RefAttributes<ContextMenuPrimitive.RadioItemRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <TextClassContext.Provider value=\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\">\n      <ContextMenuPrimitive.RadioItem\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n          }),\n          props.disabled && 'opacity-50',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n          <ContextMenuPrimitive.ItemIndicator>\n            <View className=\"bg-foreground h-2 w-2 rounded-full\" />\n          </ContextMenuPrimitive.ItemIndicator>\n        </View>\n        <>{children}</>\n      </ContextMenuPrimitive.RadioItem>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction ContextMenuLabel({\n  className,\n  inset,\n  ...props\n}: ContextMenuPrimitive.LabelProps &\n  React.RefAttributes<ContextMenuPrimitive.LabelRef> & {\n    className?: string;\n    inset?: boolean;\n  }) {\n  return (\n    <ContextMenuPrimitive.Label\n      className={cn(\n        'text-foreground px-2 py-2 text-sm font-medium sm:py-1.5',\n        inset && 'pl-8',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction ContextMenuSeparator({\n  className,\n  ...props\n}: ContextMenuPrimitive.SeparatorProps & React.RefAttributes<ContextMenuPrimitive.SeparatorRef>) {\n  return (\n    <ContextMenuPrimitive.Separator\n      className={cn('bg-border -mx-1 my-1 h-px', className)}\n      {...props}\n    />\n  );\n}\n\nfunction ContextMenuShortcut({ className, ...props }: TextProps & React.RefAttributes<Text>) {\n  return (\n    <Text\n      className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\n      {...props}\n    />\n  );\n}\n\nexport {\n  ContextMenu,\n  ContextMenuCheckboxItem,\n  ContextMenuContent,\n  ContextMenuGroup,\n  ContextMenuItem,\n  ContextMenuLabel,\n  ContextMenuRadioGroup,\n  ContextMenuRadioItem,\n  ContextMenuSeparator,\n  ContextMenuShortcut,\n  ContextMenuSub,\n  ContextMenuSubContent,\n  ContextMenuSubTrigger,\n  ContextMenuTrigger,\n};\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/dialog.tsx",
    "content": "import { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as DialogPrimitive from '@rn-primitives/dialog';\nimport { X } from 'lucide-react-native';\nimport * as React from 'react';\nimport { Platform, Text, View, type ViewProps } from 'react-native';\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction DialogOverlay({\n  className,\n  children,\n  ...props\n}: Omit<DialogPrimitive.OverlayProps, 'asChild'> &\n  React.RefAttributes<DialogPrimitive.OverlayRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <FullWindowOverlay>\n      <DialogPrimitive.Overlay\n        className={cn(\n          'absolute bottom-0 left-0 right-0 top-0 flex items-center justify-center bg-black/50 p-2',\n          Platform.select({\n            web: 'animate-in fade-in-0 fixed cursor-default [&>*]:cursor-auto',\n          }),\n          className\n        )}\n        {...props}\n        asChild={Platform.OS !== 'web'}>\n        <NativeOnlyAnimatedView entering={FadeIn.duration(200)} exiting={FadeOut.duration(150)}>\n          <NativeOnlyAnimatedView entering={FadeIn.delay(50)} exiting={FadeOut.duration(150)}>\n            <>{children}</>\n          </NativeOnlyAnimatedView>\n        </NativeOnlyAnimatedView>\n      </DialogPrimitive.Overlay>\n    </FullWindowOverlay>\n  );\n}\nfunction DialogContent({\n  className,\n  portalHost,\n  children,\n  ...props\n}: DialogPrimitive.ContentProps &\n  React.RefAttributes<DialogPrimitive.ContentRef> & {\n    portalHost?: string;\n  }) {\n  return (\n    <DialogPortal hostName={portalHost}>\n      <DialogOverlay>\n        <DialogPrimitive.Content\n          className={cn(\n            'bg-background border-border z-50 mx-auto flex w-full max-w-[calc(100%-2rem)] flex-col gap-4 rounded-lg border p-6 shadow-lg shadow-black/5 sm:max-w-lg',\n            Platform.select({\n              web: 'animate-in fade-in-0 zoom-in-95 duration-200',\n            }),\n            className\n          )}\n          {...props}>\n          <>{children}</>\n          <DialogPrimitive.Close\n            className={cn(\n              'absolute right-4 top-4 rounded opacity-70 active:opacity-100',\n              Platform.select({\n                web: 'ring-offset-background focus:ring-ring data-[state=open]:bg-accent transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-offset-2',\n              })\n            )}\n            hitSlop={12}>\n            <Icon\n              as={X}\n              className={cn('text-accent-foreground web:pointer-events-none size-4 shrink-0')}\n            />\n            <Text className=\"sr-only\">Close</Text>\n          </DialogPrimitive.Close>\n        </DialogPrimitive.Content>\n      </DialogOverlay>\n    </DialogPortal>\n  );\n}\n\nfunction DialogHeader({ className, ...props }: ViewProps) {\n  return (\n    <View className={cn('flex flex-col gap-2 text-center sm:text-left', className)} {...props} />\n  );\n}\n\nfunction DialogFooter({ className, ...props }: ViewProps) {\n  return (\n    <View\n      className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n      {...props}\n    />\n  );\n}\n\nfunction DialogTitle({\n  className,\n  ...props\n}: DialogPrimitive.TitleProps & React.RefAttributes<DialogPrimitive.TitleRef>) {\n  return (\n    <DialogPrimitive.Title\n      className={cn('text-foreground text-lg font-semibold leading-none', className)}\n      {...props}\n    />\n  );\n}\n\nfunction DialogDescription({\n  className,\n  ...props\n}: DialogPrimitive.DescriptionProps & React.RefAttributes<DialogPrimitive.DescriptionRef>) {\n  return (\n    <DialogPrimitive.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": "packages/registry/src/nativewind/components/ui/dropdown-menu.tsx",
    "content": "import { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as DropdownMenuPrimitive from '@rn-primitives/dropdown-menu';\nimport { Check, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react-native';\nimport * as React from 'react';\nimport {\n  Platform,\n  type StyleProp,\n  StyleSheet,\n  Text,\n  type TextProps,\n  View,\n  type ViewStyle,\n} from 'react-native';\nimport { FadeIn } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nfunction DropdownMenuSubTrigger({\n  className,\n  inset,\n  children,\n  iconClassName,\n  ...props\n}: DropdownMenuPrimitive.SubTriggerProps &\n  React.RefAttributes<DropdownMenuPrimitive.SubTriggerRef> & {\n    children?: React.ReactNode;\n    iconClassName?: string;\n    inset?: boolean;\n  }) {\n  const { open } = DropdownMenuPrimitive.useSubContext();\n  const icon = Platform.OS === 'web' ? ChevronRight : open ? ChevronUp : ChevronDown;\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm select-none group-active:text-accent-foreground',\n        open && 'text-accent-foreground'\n      )}>\n      <DropdownMenuPrimitive.SubTrigger\n        className={cn(\n          'active:bg-accent group flex flex-row items-center rounded-sm px-2 py-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none [&_svg]:pointer-events-none',\n          }),\n          className,\n          open && 'bg-accent',\n          inset && 'pl-8'\n        )}\n        {...props}>\n        <>{children}</>\n        <Icon as={icon} className={cn('text-foreground ml-auto size-4 shrink-0', iconClassName)} />\n      </DropdownMenuPrimitive.SubTrigger>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction DropdownMenuSubContent({\n  className,\n  ...props\n}: DropdownMenuPrimitive.SubContentProps &\n  React.RefAttributes<DropdownMenuPrimitive.SubContentRef>) {\n  return (\n    <NativeOnlyAnimatedView entering={FadeIn}>\n      <DropdownMenuPrimitive.SubContent\n        className={cn(\n          'bg-popover border-border overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\n          Platform.select({\n            web: 'animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fade-in-0 data-[state=closed]:zoom-out-95 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 origin-(--radix-context-menu-content-transform-origin) z-50 min-w-[8rem]',\n          }),\n          className\n        )}\n        {...props}\n      />\n    </NativeOnlyAnimatedView>\n  );\n}\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction DropdownMenuContent({\n  className,\n  overlayClassName,\n  overlayStyle,\n  portalHost,\n  ...props\n}: DropdownMenuPrimitive.ContentProps &\n  React.RefAttributes<DropdownMenuPrimitive.ContentRef> & {\n    overlayStyle?: StyleProp<ViewStyle>;\n    overlayClassName?: string;\n    portalHost?: string;\n  }) {\n  return (\n    <DropdownMenuPrimitive.Portal hostName={portalHost}>\n      <FullWindowOverlay>\n        <DropdownMenuPrimitive.Overlay\n          style={Platform.select({\n            web: overlayStyle ?? undefined,\n            native: overlayStyle\n              ? StyleSheet.flatten([\n                StyleSheet.absoluteFill,\n                overlayStyle as typeof StyleSheet.absoluteFill,\n              ])\n              : StyleSheet.absoluteFill,\n          })}\n          className={overlayClassName}>\n          <NativeOnlyAnimatedView entering={FadeIn}>\n            <TextClassContext.Provider value=\"text-popover-foreground\">\n              <DropdownMenuPrimitive.Content\n                className={cn(\n                  'bg-popover border-border min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\n                  Platform.select({\n                    web: cn(\n                      'animate-in fade-in-0 zoom-in-95 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) z-50 cursor-default',\n                      props.side === 'bottom' && 'slide-in-from-top-2',\n                      props.side === 'top' && 'slide-in-from-bottom-2'\n                    ),\n                  }),\n                  className\n                )}\n                {...props}\n              />\n            </TextClassContext.Provider>\n          </NativeOnlyAnimatedView>\n        </DropdownMenuPrimitive.Overlay>\n      </FullWindowOverlay>\n    </DropdownMenuPrimitive.Portal>\n  );\n}\n\nfunction DropdownMenuItem({\n  className,\n  inset,\n  variant,\n  ...props\n}: DropdownMenuPrimitive.ItemProps &\n  React.RefAttributes<DropdownMenuPrimitive.ItemRef> & {\n    className?: string;\n    inset?: boolean;\n    variant?: 'default' | 'destructive';\n  }) {\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'select-none text-sm text-popover-foreground group-active:text-popover-foreground',\n        variant === 'destructive' && 'text-destructive group-active:text-destructive'\n      )}>\n      <DropdownMenuPrimitive.Item\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm px-2 py-2 sm:py-1.5',\n          Platform.select({\n            web: cn(\n              'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n              variant === 'destructive' && 'focus:bg-destructive/10 dark:focus:bg-destructive/20'\n            ),\n          }),\n          variant === 'destructive' && 'active:bg-destructive/10 dark:active:bg-destructive/20',\n          props.disabled && 'opacity-50',\n          inset && 'pl-8',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction DropdownMenuCheckboxItem({\n  className,\n  children,\n  ...props\n}: DropdownMenuPrimitive.CheckboxItemProps &\n  React.RefAttributes<DropdownMenuPrimitive.CheckboxItemRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <TextClassContext.Provider value=\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\">\n      <DropdownMenuPrimitive.CheckboxItem\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n          }),\n          props.disabled && 'opacity-50',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n          <DropdownMenuPrimitive.ItemIndicator>\n            <Icon\n              as={Check}\n              className={cn(\n                'text-foreground size-4',\n                Platform.select({ web: 'pointer-events-none' })\n              )}\n            />\n          </DropdownMenuPrimitive.ItemIndicator>\n        </View>\n        <>{children}</>\n      </DropdownMenuPrimitive.CheckboxItem>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction DropdownMenuRadioItem({\n  className,\n  children,\n  ...props\n}: DropdownMenuPrimitive.RadioItemProps &\n  React.RefAttributes<DropdownMenuPrimitive.RadioItemRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <TextClassContext.Provider value=\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\">\n      <DropdownMenuPrimitive.RadioItem\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n          }),\n          props.disabled && 'opacity-50',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n          <DropdownMenuPrimitive.ItemIndicator>\n            <View className=\"bg-foreground h-2 w-2 rounded-full\" />\n          </DropdownMenuPrimitive.ItemIndicator>\n        </View>\n        <>{children}</>\n      </DropdownMenuPrimitive.RadioItem>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction DropdownMenuLabel({\n  className,\n  inset,\n  ...props\n}: DropdownMenuPrimitive.LabelProps &\n  React.RefAttributes<DropdownMenuPrimitive.LabelRef> & {\n    className?: string;\n    inset?: boolean;\n  }) {\n  return (\n    <DropdownMenuPrimitive.Label\n      className={cn(\n        'text-foreground px-2 py-2 text-sm font-medium sm:py-1.5',\n        inset && 'pl-8',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuSeparator({\n  className,\n  ...props\n}: DropdownMenuPrimitive.SeparatorProps & React.RefAttributes<DropdownMenuPrimitive.SeparatorRef>) {\n  return (\n    <DropdownMenuPrimitive.Separator\n      className={cn('bg-border -mx-1 my-1 h-px', className)}\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuShortcut({ className, ...props }: TextProps & React.RefAttributes<Text>) {\n  return (\n    <Text\n      className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\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": "packages/registry/src/nativewind/components/ui/hover-card.tsx",
    "content": "import { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as HoverCardPrimitive from '@rn-primitives/hover-card';\nimport * as React from 'react';\nimport { Platform, StyleSheet } from 'react-native';\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst HoverCard = HoverCardPrimitive.Root;\n\nconst HoverCardTrigger = HoverCardPrimitive.Trigger;\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction HoverCardContent({\n  className,\n  align = 'center',\n  sideOffset = 4,\n  ...props\n}: HoverCardPrimitive.ContentProps & React.RefAttributes<HoverCardPrimitive.ContentRef>) {\n  return (\n    <HoverCardPrimitive.Portal>\n      <FullWindowOverlay>\n        <HoverCardPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\n          <NativeOnlyAnimatedView entering={FadeIn} exiting={FadeOut}>\n            <TextClassContext.Provider value=\"text-popover-foreground\">\n              <HoverCardPrimitive.Content\n                align={align}\n                sideOffset={sideOffset}\n                className={cn(\n                  'bg-popover border-border outline-hidden z-50 w-64 rounded-md border p-4 shadow-md shadow-black/5',\n                  Platform.select({\n                    web: cn(\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-hover-card-content-transform-origin) cursor-default [&>*]:cursor-auto',\n                      props.side === 'bottom' && 'slide-in-from-top-2',\n                      props.side === 'top' && 'slide-in-from-bottom-2'\n                    ),\n                  }),\n                  className\n                )}\n                {...props}\n              />\n            </TextClassContext.Provider>\n          </NativeOnlyAnimatedView>\n        </HoverCardPrimitive.Overlay>\n      </FullWindowOverlay>\n    </HoverCardPrimitive.Portal>\n  );\n}\n\nexport { HoverCard, HoverCardContent, HoverCardTrigger };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/icon.tsx",
    "content": "import { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport type { LucideIcon, LucideProps } from 'lucide-react-native';\nimport { cssInterop } from 'nativewind';\nimport * as React from 'react';\n\ntype IconProps = LucideProps & {\n  as: LucideIcon;\n};\n\nfunction IconImpl({ as: IconComponent, ...props }: IconProps) {\n  return <IconComponent {...props} />;\n}\n\ncssInterop(IconImpl, {\n  className: {\n    target: 'style',\n    nativeStyleToProp: {\n      height: 'size',\n      width: 'size',\n    },\n  },\n});\n\n/**\n * A wrapper component for Lucide icons with Nativewind `className` support via `cssInterop`.\n *\n * This component allows you to render any Lucide icon while applying utility classes\n * using `nativewind`. It avoids the need to wrap or configure each icon individually.\n *\n * @component\n * @example\n * ```tsx\n * import { ArrowRight } from 'lucide-react-native';\n * import { Icon } from '@/registry/components/ui/icon';\n *\n * <Icon as={ArrowRight} className=\"text-red-500\" size={16} />\n * ```\n *\n * @param {LucideIcon} as - The Lucide icon component to render.\n * @param {string} className - Utility classes to style the icon using Nativewind.\n * @param {number} size - Icon size (defaults to 14).\n * @param {...LucideProps} ...props - Additional Lucide icon props passed to the \"as\" icon.\n */\nfunction Icon({ as: IconComponent, className, size = 14, ...props }: IconProps) {\n  const textClass = React.useContext(TextClassContext);\n  return (\n    <IconImpl\n      as={IconComponent}\n      className={cn('text-foreground', textClass, className)}\n      size={size}\n      {...props}\n    />\n  );\n}\n\nexport { Icon };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/input.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport { Platform, TextInput, type TextInputProps } from 'react-native';\n\nfunction Input({ className, ...props }: TextInputProps & React.RefAttributes<TextInput>) {\n  return (\n    <TextInput\n      className={cn(\n        'dark:bg-input/30 border-input bg-background text-foreground flex h-10 w-full min-w-0 flex-row items-center rounded-md border px-3 py-1 text-base leading-5 shadow-sm shadow-black/5 sm:h-9',\n        props.editable === false &&\n          cn(\n            'opacity-50',\n            Platform.select({ web: 'disabled:pointer-events-none disabled:cursor-not-allowed' })\n          ),\n        Platform.select({\n          web: cn(\n            'placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground outline-none transition-[color,box-shadow] md:text-sm',\n            'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n            'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive'\n          ),\n          native: 'placeholder:text-muted-foreground/50',\n        }),\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nexport { Input };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/label.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport * as LabelPrimitive from '@rn-primitives/label';\nimport { Platform } from 'react-native';\n\nfunction Label({\n  className,\n  onPress,\n  onLongPress,\n  onPressIn,\n  onPressOut,\n  disabled,\n  ...props\n}: LabelPrimitive.TextProps & React.RefAttributes<LabelPrimitive.TextRef>) {\n  return (\n    <LabelPrimitive.Root\n      className={cn(\n        'flex select-none flex-row items-center gap-2',\n        Platform.select({\n          web: 'cursor-default leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-50 group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50',\n        }),\n        disabled && 'opacity-50'\n      )}\n      onPress={onPress}\n      onLongPress={onLongPress}\n      onPressIn={onPressIn}\n      onPressOut={onPressOut}\n      disabled={disabled}>\n      <LabelPrimitive.Text\n        className={cn(\n          'text-foreground text-sm font-medium',\n          Platform.select({ web: 'leading-none' }),\n          className\n        )}\n        {...props}\n      />\n    </LabelPrimitive.Root>\n  );\n}\n\nexport { Label };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/menubar.tsx",
    "content": "import { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as MenubarPrimitive from '@rn-primitives/menubar';\nimport { Portal } from '@rn-primitives/portal';\nimport { Check, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react-native';\nimport * as React from 'react';\nimport {\n  Platform,\n  Pressable,\n  type StyleProp,\n  StyleSheet,\n  Text,\n  type TextProps,\n  View,\n  type ViewStyle,\n} from 'react-native';\nimport { FadeIn } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst MenubarMenu = MenubarPrimitive.Menu;\n\nconst MenubarGroup = MenubarPrimitive.Group;\n\nconst MenubarPortal = MenubarPrimitive.Portal;\n\nconst MenubarSub = MenubarPrimitive.Sub;\n\nconst MenubarRadioGroup = MenubarPrimitive.RadioGroup;\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction Menubar({\n  className,\n  value: valueProp,\n  onValueChange: onValueChangeProp,\n  ...props\n}: MenubarPrimitive.RootProps & React.RefAttributes<MenubarPrimitive.RootRef>) {\n  const id = React.useId();\n  const [value, setValue] = React.useState<string | undefined>(undefined);\n\n  function closeMenu() {\n    if (onValueChangeProp) {\n      onValueChangeProp(undefined);\n      return;\n    }\n    setValue(undefined);\n  }\n\n  return (\n    <>\n      {Platform.OS !== 'web' && (value || valueProp) ? (\n        <Portal name={`menubar-overlay-${id}`}>\n          <Pressable onPress={closeMenu} style={StyleSheet.absoluteFill} />\n        </Portal>\n      ) : null}\n      <MenubarPrimitive.Root\n        className={cn(\n          'bg-background border-border flex h-10 flex-row items-center gap-1 rounded-md border p-1 shadow-sm shadow-black/5 sm:h-9',\n          className\n        )}\n        value={value ?? valueProp}\n        onValueChange={onValueChangeProp ?? setValue}\n        {...props}\n      />\n    </>\n  );\n}\n\nfunction MenubarTrigger({\n  className,\n  ...props\n}: MenubarPrimitive.TriggerProps & React.RefAttributes<MenubarPrimitive.TriggerRef>) {\n  const { value } = MenubarPrimitive.useRootContext();\n  const { value: itemValue } = MenubarPrimitive.useMenuContext();\n\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm font-medium select-none group-active:text-accent-foreground',\n        value === itemValue && 'text-accent-foreground'\n      )}>\n      <MenubarPrimitive.Trigger\n        className={cn(\n          'group flex items-center rounded-md px-2 py-1.5 sm:py-1',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none',\n          }),\n          value === itemValue && 'bg-accent',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction MenubarSubTrigger({\n  className,\n  inset,\n  children,\n  iconClassName,\n  ...props\n}: MenubarPrimitive.SubTriggerProps &\n  React.RefAttributes<MenubarPrimitive.SubTriggerRef> & {\n    children?: React.ReactNode;\n    iconClassName?: string;\n    inset?: boolean;\n  }) {\n  const { open } = MenubarPrimitive.useSubContext();\n  const icon = Platform.OS === 'web' ? ChevronRight : open ? ChevronUp : ChevronDown;\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm select-none group-active:text-accent-foreground',\n        open && 'text-accent-foreground'\n      )}>\n      <MenubarPrimitive.SubTrigger\n        className={cn(\n          'active:bg-accent group flex flex-row items-center rounded-sm px-2 py-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none [&_svg]:pointer-events-none',\n          }),\n          className,\n          open && 'bg-accent',\n          inset && 'pl-8'\n        )}\n        {...props}>\n        <>{children}</>\n        <Icon as={icon} className={cn('text-foreground ml-auto size-4 shrink-0', iconClassName)} />\n      </MenubarPrimitive.SubTrigger>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction MenubarSubContent({\n  className,\n  ...props\n}: MenubarPrimitive.SubContentProps & React.RefAttributes<MenubarPrimitive.SubContentRef>) {\n  return (\n    <NativeOnlyAnimatedView entering={FadeIn}>\n      <MenubarPrimitive.SubContent\n        className={cn(\n          'bg-popover border-border overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\n          Platform.select({\n            web: 'animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fade-in-0 data-[state=closed]:zoom-out-95 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 origin-(--radix-context-menu-content-transform-origin) z-50 min-w-[8rem]',\n          }),\n          className\n        )}\n        {...props}\n      />\n    </NativeOnlyAnimatedView>\n  );\n}\n\nfunction MenubarContent({\n  className,\n  portalHost,\n  align = 'start',\n  alignOffset = -4,\n  sideOffset = 8,\n  ...props\n}: MenubarPrimitive.ContentProps &\n  React.RefAttributes<MenubarPrimitive.ContentRef> & {\n    portalHost?: string;\n  }) {\n  return (\n    <MenubarPrimitive.Portal hostName={portalHost}>\n      <FullWindowOverlay>\n        <NativeOnlyAnimatedView\n          entering={FadeIn}\n          style={StyleSheet.absoluteFill}\n          pointerEvents=\"box-none\">\n          <TextClassContext.Provider value=\"text-popover-foreground\">\n            <MenubarPrimitive.Content\n              className={cn(\n                'bg-popover border-border min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\n                Platform.select({\n                  web: cn(\n                    'animate-in fade-in-0 zoom-in-95 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) z-50 cursor-default',\n                    props.side === 'bottom' && 'slide-in-from-top-2',\n                    props.side === 'top' && 'slide-in-from-bottom-2'\n                  ),\n                }),\n                className\n              )}\n              align={align}\n              alignOffset={alignOffset}\n              sideOffset={sideOffset}\n              {...props}\n            />\n          </TextClassContext.Provider>\n        </NativeOnlyAnimatedView>\n      </FullWindowOverlay>\n    </MenubarPrimitive.Portal>\n  );\n}\n\nfunction MenubarItem({\n  className,\n  inset,\n  variant,\n  ...props\n}: MenubarPrimitive.ItemProps &\n  React.RefAttributes<MenubarPrimitive.ItemRef> & {\n    className?: string;\n    inset?: boolean;\n    variant?: 'default' | 'destructive';\n  }) {\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'select-none text-sm text-popover-foreground group-active:text-popover-foreground',\n        variant === 'destructive' && 'text-destructive group-active:text-destructive'\n      )}>\n      <MenubarPrimitive.Item\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm px-2 py-2 sm:py-1.5',\n          Platform.select({\n            web: cn(\n              'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n              variant === 'destructive' && 'focus:bg-destructive/10 dark:focus:bg-destructive/20'\n            ),\n          }),\n          variant === 'destructive' && 'active:bg-destructive/10 dark:active:bg-destructive/20',\n          props.disabled && 'opacity-50',\n          inset && 'pl-8',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction MenubarCheckboxItem({\n  className,\n  children,\n  ...props\n}: MenubarPrimitive.CheckboxItemProps &\n  React.RefAttributes<MenubarPrimitive.CheckboxItemRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <TextClassContext.Provider value=\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\">\n      <MenubarPrimitive.CheckboxItem\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n          }),\n          props.disabled && 'opacity-50',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n          <MenubarPrimitive.ItemIndicator>\n            <Icon\n              as={Check}\n              className={cn(\n                'text-foreground size-4',\n                Platform.select({ web: 'pointer-events-none' })\n              )}\n            />\n          </MenubarPrimitive.ItemIndicator>\n        </View>\n        <>{children}</>\n      </MenubarPrimitive.CheckboxItem>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction MenubarRadioItem({\n  className,\n  children,\n  ...props\n}: MenubarPrimitive.RadioItemProps &\n  React.RefAttributes<MenubarPrimitive.RadioItemRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <TextClassContext.Provider value=\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\">\n      <MenubarPrimitive.RadioItem\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n          }),\n          props.disabled && 'opacity-50',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n          <MenubarPrimitive.ItemIndicator>\n            <View className=\"bg-foreground h-2 w-2 rounded-full\" />\n          </MenubarPrimitive.ItemIndicator>\n        </View>\n        <>{children}</>\n      </MenubarPrimitive.RadioItem>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction MenubarLabel({\n  className,\n  inset,\n  ...props\n}: MenubarPrimitive.LabelProps &\n  React.RefAttributes<MenubarPrimitive.LabelRef> & {\n    className?: string;\n    inset?: boolean;\n  }) {\n  return (\n    <MenubarPrimitive.Label\n      className={cn(\n        'text-foreground px-2 py-2 text-sm font-medium sm:py-1.5',\n        inset && 'pl-8',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction MenubarSeparator({\n  className,\n  ...props\n}: MenubarPrimitive.SeparatorProps & React.RefAttributes<MenubarPrimitive.SeparatorRef>) {\n  return (\n    <MenubarPrimitive.Separator className={cn('bg-border -mx-1 my-1 h-px', className)} {...props} />\n  );\n}\n\nfunction MenubarShortcut({ className, ...props }: TextProps & React.RefAttributes<Text>) {\n  return (\n    <Text\n      className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\n      {...props}\n    />\n  );\n}\n\nexport {\n  Menubar,\n  MenubarCheckboxItem,\n  MenubarContent,\n  MenubarGroup,\n  MenubarItem,\n  MenubarLabel,\n  MenubarMenu,\n  MenubarPortal,\n  MenubarRadioGroup,\n  MenubarRadioItem,\n  MenubarSeparator,\n  MenubarShortcut,\n  MenubarSub,\n  MenubarSubContent,\n  MenubarSubTrigger,\n  MenubarTrigger,\n};\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/native-only-animated-view.tsx",
    "content": "import { Platform } from 'react-native';\nimport Animated from 'react-native-reanimated';\n\n/**\n * This component is used to wrap animated views that should only be animated on native.\n * @param props - The props for the animated view.\n * @returns The animated view if the platform is native, otherwise the children.\n * @example\n * <NativeOnlyAnimatedView entering={FadeIn} exiting={FadeOut}>\n *   <Text>I am only animated on native</Text>\n * </NativeOnlyAnimatedView>\n */\nfunction NativeOnlyAnimatedView(\n  props: React.ComponentProps<typeof Animated.View> & React.RefAttributes<Animated.View>\n) {\n  if (Platform.OS === 'web') {\n    return <>{props.children as React.ReactNode}</>;\n  } else {\n    return <Animated.View {...props} />;\n  }\n}\n\nexport { NativeOnlyAnimatedView };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/popover.tsx",
    "content": "import { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as PopoverPrimitive from '@rn-primitives/popover';\nimport * as React from 'react';\nimport { Platform, StyleSheet } from 'react-native';\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction PopoverContent({\n  className,\n  align = 'center',\n  sideOffset = 4,\n  portalHost,\n  ...props\n}: PopoverPrimitive.ContentProps &\n  React.RefAttributes<PopoverPrimitive.ContentRef> & {\n    portalHost?: string;\n  }) {\n  return (\n    <PopoverPrimitive.Portal hostName={portalHost}>\n      <FullWindowOverlay>\n        <PopoverPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\n          <NativeOnlyAnimatedView entering={FadeIn.duration(200)} exiting={FadeOut}>\n            <TextClassContext.Provider value=\"text-popover-foreground\">\n              <PopoverPrimitive.Content\n                align={align}\n                sideOffset={sideOffset}\n                className={cn(\n                  'bg-popover border-border outline-hidden z-50 w-72 rounded-md border p-4 shadow-md shadow-black/5',\n                  Platform.select({\n                    web: cn(\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-popover-content-transform-origin) cursor-auto',\n                      props.side === 'bottom' && 'slide-in-from-top-2',\n                      props.side === 'top' && 'slide-in-from-bottom-2'\n                    ),\n                  }),\n                  className\n                )}\n                {...props}\n              />\n            </TextClassContext.Provider>\n          </NativeOnlyAnimatedView>\n        </PopoverPrimitive.Overlay>\n      </FullWindowOverlay>\n    </PopoverPrimitive.Portal>\n  );\n}\n\nexport { Popover, PopoverContent, PopoverTrigger };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/progress.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport * as ProgressPrimitive from '@rn-primitives/progress';\nimport { Platform, View } from 'react-native';\nimport Animated, {\n  Extrapolation,\n  interpolate,\n  useAnimatedStyle,\n  useDerivedValue,\n  withSpring,\n} from 'react-native-reanimated';\n\nfunction Progress({\n  className,\n  value,\n  indicatorClassName,\n  ...props\n}: ProgressPrimitive.RootProps &\n  React.RefAttributes<ProgressPrimitive.RootRef> & {\n    indicatorClassName?: string;\n  }) {\n  return (\n    <ProgressPrimitive.Root\n      className={cn('bg-primary/20 relative h-2 w-full overflow-hidden rounded-full', className)}\n      {...props}>\n      <Indicator value={value} className={indicatorClassName} />\n    </ProgressPrimitive.Root>\n  );\n}\n\nexport { Progress };\n\nconst Indicator = Platform.select({\n  web: WebIndicator,\n  native: NativeIndicator,\n  default: NullIndicator,\n});\n\ntype IndicatorProps = {\n  value: number | undefined | null;\n  className?: string;\n};\n\nfunction WebIndicator({ value, className }: IndicatorProps) {\n  if (Platform.OS !== 'web') {\n    return null;\n  }\n\n  return (\n    <View\n      className={cn('bg-primary h-full w-full flex-1 transition-all', className)}\n      style={{ transform: `translateX(-${100 - (value ?? 0)}%)` }}>\n      <ProgressPrimitive.Indicator className={cn('h-full w-full', className)} />\n    </View>\n  );\n}\n\nfunction NativeIndicator({ value, className }: IndicatorProps) {\n  const progress = useDerivedValue(() => value ?? 0);\n\n  const indicator = useAnimatedStyle(() => {\n    return {\n      width: withSpring(\n        `${interpolate(progress.value, [0, 100], [1, 100], Extrapolation.CLAMP)}%`,\n        { overshootClamping: true }\n      ),\n    };\n  }, [value]);\n\n  if (Platform.OS === 'web') {\n    return null;\n  }\n\n  return (\n    <ProgressPrimitive.Indicator asChild>\n      <Animated.View style={indicator} className={cn('bg-foreground h-full', className)} />\n    </ProgressPrimitive.Indicator>\n  );\n}\n\nfunction NullIndicator(_props: IndicatorProps) {\n  return null;\n}\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/radio-group.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport * as RadioGroupPrimitive from '@rn-primitives/radio-group';\nimport { Platform } from 'react-native';\n\nfunction RadioGroup({\n  className,\n  ...props\n}: RadioGroupPrimitive.RootProps & React.RefAttributes<RadioGroupPrimitive.RootRef>) {\n  return <RadioGroupPrimitive.Root className={cn('gap-3', className)} {...props} />;\n}\n\nfunction RadioGroupItem({\n  className,\n  ...props\n}: RadioGroupPrimitive.ItemProps & React.RefAttributes<RadioGroupPrimitive.ItemRef>) {\n  return (\n    <RadioGroupPrimitive.Item\n      className={cn(\n        'border-input dark:bg-input/30 aspect-square size-4 shrink-0 items-center justify-center rounded-full border shadow-sm shadow-black/5',\n        Platform.select({\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive outline-none transition-all focus-visible:ring-[3px] disabled:cursor-not-allowed',\n        }),\n        props.disabled && 'opacity-50',\n        className\n      )}\n      {...props}>\n      <RadioGroupPrimitive.Indicator className=\"bg-primary size-2 rounded-full\" />\n    </RadioGroupPrimitive.Item>\n  );\n}\n\nexport { RadioGroup, RadioGroupItem };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/select.tsx",
    "content": "import { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as SelectPrimitive from '@rn-primitives/select';\nimport { Check, ChevronDown, ChevronDownIcon, ChevronUpIcon } from 'lucide-react-native';\nimport * as React from 'react';\nimport { Platform, StyleSheet, View } from 'react-native';\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\ntype Option = SelectPrimitive.Option;\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nfunction SelectValue({\n  ref,\n  className,\n  ...props\n}: SelectPrimitive.ValueProps &\n  React.RefAttributes<SelectPrimitive.ValueRef> & {\n    className?: string;\n  }) {\n  const { value } = SelectPrimitive.useRootContext();\n  return (\n    <SelectPrimitive.Value\n      ref={ref}\n      className={cn(\n        'text-foreground line-clamp-1 flex flex-row items-center gap-2 text-sm',\n        !value && 'text-muted-foreground',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction SelectTrigger({\n  ref,\n  className,\n  children,\n  size = 'default',\n  ...props\n}: SelectPrimitive.TriggerProps &\n  React.RefAttributes<SelectPrimitive.TriggerRef> & {\n    children?: React.ReactNode;\n    size?: 'default' | 'sm';\n  }) {\n  return (\n    <SelectPrimitive.Trigger\n      ref={ref}\n      className={cn(\n        'border-input dark:bg-input/30 dark:active:bg-input/50 bg-background flex h-10 flex-row items-center justify-between gap-2 rounded-md border px-3 py-2 shadow-sm shadow-black/5 sm:h-9',\n        Platform.select({\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:hover:bg-input/50 w-fit whitespace-nowrap text-sm outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:shrink-0',\n        }),\n        props.disabled && 'opacity-50',\n        size === 'sm' && 'h-8 py-2 sm:py-1.5',\n        className\n      )}\n      {...props}>\n      <>{children}</>\n      <Icon as={ChevronDown} aria-hidden={true} className=\"text-muted-foreground size-4\" />\n    </SelectPrimitive.Trigger>\n  );\n}\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction SelectContent({\n  className,\n  children,\n  position = 'popper',\n  portalHost,\n  ...props\n}: SelectPrimitive.ContentProps &\n  React.RefAttributes<SelectPrimitive.ContentRef> & {\n    className?: string;\n    portalHost?: string;\n  }) {\n  return (\n    <SelectPrimitive.Portal hostName={portalHost}>\n      <FullWindowOverlay>\n        <SelectPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\n          <TextClassContext.Provider value=\"text-popover-foreground\">\n            <NativeOnlyAnimatedView className=\"z-50\" entering={FadeIn} exiting={FadeOut}>\n              <SelectPrimitive.Content\n                className={cn(\n                  'bg-popover border-border relative z-50 min-w-[8rem] rounded-md border shadow-md shadow-black/5',\n                  Platform.select({\n                    web: cn(\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-select-content-transform-origin) max-h-52 overflow-y-auto overflow-x-hidden',\n                      props.side === 'bottom' && 'slide-in-from-top-2',\n                      props.side === 'top' && 'slide-in-from-bottom-2'\n                    ),\n                    native: 'p-1',\n                  }),\n                  position === 'popper' &&\n                  Platform.select({\n                    web: cn(\n                      props.side === 'bottom' && 'translate-y-1',\n                      props.side === 'top' && '-translate-y-1'\n                    ),\n                  }),\n                  className\n                )}\n                position={position}\n                {...props}>\n                <SelectScrollUpButton />\n                <SelectPrimitive.Viewport\n                  className={cn(\n                    'p-1',\n                    position === 'popper' &&\n                    cn(\n                      'w-full',\n                      Platform.select({\n                        web: 'h-[var(--radix-select-trigger-height)] min-w-[var(--radix-select-trigger-width)]',\n                      })\n                    )\n                  )}>\n                  {children}\n                </SelectPrimitive.Viewport>\n                <SelectScrollDownButton />\n              </SelectPrimitive.Content>\n            </NativeOnlyAnimatedView>\n          </TextClassContext.Provider>\n        </SelectPrimitive.Overlay>\n      </FullWindowOverlay>\n    </SelectPrimitive.Portal>\n  );\n}\n\nfunction SelectLabel({\n  className,\n  ...props\n}: SelectPrimitive.LabelProps & React.RefAttributes<SelectPrimitive.LabelRef>) {\n  return (\n    <SelectPrimitive.Label\n      className={cn('text-muted-foreground px-2 py-2 text-xs sm:py-1.5', className)}\n      {...props}\n    />\n  );\n}\n\nfunction SelectItem({\n  className,\n  children,\n  ...props\n}: SelectPrimitive.ItemProps & React.RefAttributes<SelectPrimitive.ItemRef>) {\n  return (\n    <SelectPrimitive.Item\n      className={cn(\n        'active:bg-accent group relative flex w-full flex-row items-center gap-2 rounded-sm py-2 pl-2 pr-8 sm:py-1.5',\n        Platform.select({\n          web: 'focus:bg-accent focus:text-accent-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 cursor-default outline-none data-[disabled]:pointer-events-none [&_svg]:pointer-events-none',\n        }),\n        props.disabled && 'opacity-50',\n        className\n      )}\n      {...props}>\n      <View className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n        <SelectPrimitive.ItemIndicator>\n          <Icon as={Check} className=\"text-muted-foreground size-4 shrink-0\" />\n        </SelectPrimitive.ItemIndicator>\n      </View>\n      <SelectPrimitive.ItemText className=\"text-foreground group-active:text-accent-foreground select-none text-sm\" />\n    </SelectPrimitive.Item>\n  );\n}\n\nfunction SelectSeparator({\n  className,\n  ...props\n}: SelectPrimitive.SeparatorProps & React.RefAttributes<SelectPrimitive.SeparatorRef>) {\n  return (\n    <SelectPrimitive.Separator\n      className={cn(\n        'bg-border -mx-1 my-1 h-px',\n        Platform.select({ web: 'pointer-events-none' }),\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\n/**\n * @platform Web only\n * Returns null on native platforms\n */\nfunction SelectScrollUpButton({\n  className,\n  ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n  if (Platform.OS !== 'web') {\n    return null;\n  }\n  return (\n    <SelectPrimitive.ScrollUpButton\n      className={cn('flex cursor-default items-center justify-center py-1', className)}\n      {...props}>\n      <Icon as={ChevronUpIcon} className=\"size-4\" />\n    </SelectPrimitive.ScrollUpButton>\n  );\n}\n\n/**\n * @platform Web only\n * Returns null on native platforms\n */\nfunction SelectScrollDownButton({\n  className,\n  ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n  if (Platform.OS !== 'web') {\n    return null;\n  }\n  return (\n    <SelectPrimitive.ScrollDownButton\n      className={cn('flex cursor-default items-center justify-center py-1', className)}\n      {...props}>\n      <Icon as={ChevronDownIcon} className=\"size-4\" />\n    </SelectPrimitive.ScrollDownButton>\n  );\n}\n\n\n\nexport {\n  Select,\n  SelectContent,\n  SelectGroup,\n  SelectItem,\n  SelectLabel,\n  SelectScrollDownButton,\n  SelectScrollUpButton,\n  SelectSeparator,\n  SelectTrigger,\n  SelectValue,\n  type Option,\n};\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/separator.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport * as SeparatorPrimitive from '@rn-primitives/separator';\n\nfunction Separator({\n  className,\n  orientation = 'horizontal',\n  decorative = true,\n  ...props\n}: SeparatorPrimitive.RootProps & React.RefAttributes<SeparatorPrimitive.RootRef>) {\n  return (\n    <SeparatorPrimitive.Root\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}\n\nexport { Separator };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/skeleton.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport { View } from 'react-native';\n\nfunction Skeleton({\n  className,\n  ...props\n}: React.ComponentProps<typeof View> & React.RefAttributes<View>) {\n  return <View className={cn('bg-accent animate-pulse rounded-md', className)} {...props} />;\n}\n\nexport { Skeleton };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/switch.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport * as SwitchPrimitives from '@rn-primitives/switch';\nimport { Platform } from 'react-native';\n\nfunction Switch({\n  className,\n  ...props\n}: SwitchPrimitives.RootProps & React.RefAttributes<SwitchPrimitives.RootRef>) {\n  return (\n    <SwitchPrimitives.Root\n      className={cn(\n        'flex h-[1.15rem] w-8 shrink-0 flex-row items-center rounded-full border border-transparent shadow-sm shadow-black/5',\n        Platform.select({\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 peer inline-flex outline-none transition-all focus-visible:ring-[3px] disabled:cursor-not-allowed',\n        }),\n        props.checked ? 'bg-primary' : 'bg-input dark:bg-input/80',\n        props.disabled && 'opacity-50',\n        className\n      )}\n      {...props}>\n      <SwitchPrimitives.Thumb\n        className={cn(\n          'bg-background size-4 rounded-full transition-transform',\n          Platform.select({\n            web: 'pointer-events-none block ring-0',\n          }),\n          props.checked\n            ? 'dark:bg-primary-foreground translate-x-3.5'\n            : 'dark:bg-foreground translate-x-0'\n        )}\n      />\n    </SwitchPrimitives.Root>\n  );\n}\n\nexport { Switch };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/tabs.tsx",
    "content": "import { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as TabsPrimitive from '@rn-primitives/tabs';\nimport { Platform } from 'react-native';\n\nfunction Tabs({\n  className,\n  ...props\n}: TabsPrimitive.RootProps & React.RefAttributes<TabsPrimitive.RootRef>) {\n  return <TabsPrimitive.Root className={cn('flex flex-col gap-2', className)} {...props} />;\n}\n\nfunction TabsList({\n  className,\n  ...props\n}: TabsPrimitive.ListProps & React.RefAttributes<TabsPrimitive.ListRef>) {\n  return (\n    <TabsPrimitive.List\n      className={cn(\n        'bg-muted flex h-9 flex-row items-center justify-center rounded-lg p-[3px]',\n        Platform.select({ web: 'inline-flex w-fit', native: 'mr-auto' }),\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction TabsTrigger({\n  className,\n  ...props\n}: TabsPrimitive.TriggerProps & React.RefAttributes<TabsPrimitive.TriggerRef>) {\n  const { value } = TabsPrimitive.useRootContext();\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-foreground dark:text-muted-foreground text-sm font-medium',\n        value === props.value && 'dark:text-foreground'\n      )}>\n      <TabsPrimitive.Trigger\n        className={cn(\n          'flex h-[calc(100%-1px)] flex-row items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 shadow-none shadow-black/5',\n          Platform.select({\n            web: 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring inline-flex cursor-default whitespace-nowrap transition-[color,box-shadow] focus-visible:outline-1 focus-visible:ring-[3px] disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0',\n          }),\n          props.disabled && 'opacity-50',\n          props.value === value && 'bg-background dark:border-foreground/10 dark:bg-input/30',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction TabsContent({\n  className,\n  ...props\n}: TabsPrimitive.ContentProps & React.RefAttributes<TabsPrimitive.ContentRef>) {\n  return (\n    <TabsPrimitive.Content\n      className={cn(Platform.select({ web: 'flex-1 outline-none' }), className)}\n      {...props}\n    />\n  );\n}\n\nexport { Tabs, TabsContent, TabsList, TabsTrigger };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/text.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport * as Slot from '@rn-primitives/slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport { Platform, Text as RNText, type Role } from 'react-native';\n\nconst textVariants = cva(\n  cn(\n    'text-foreground text-base',\n    Platform.select({\n      web: 'select-text',\n    })\n  ),\n  {\n    variants: {\n      variant: {\n        default: '',\n        h1: cn(\n          'text-center text-4xl font-extrabold tracking-tight',\n          Platform.select({ web: 'scroll-m-20 text-balance' })\n        ),\n        h2: cn(\n          'border-border border-b pb-2 text-3xl font-semibold tracking-tight',\n          Platform.select({ web: 'scroll-m-20 first:mt-0' })\n        ),\n        h3: cn('text-2xl font-semibold tracking-tight', Platform.select({ web: 'scroll-m-20' })),\n        h4: cn('text-xl font-semibold tracking-tight', Platform.select({ web: 'scroll-m-20' })),\n        p: 'mt-3 leading-7 sm:mt-6',\n        blockquote: 'mt-4 border-l-2 pl-3 italic sm:mt-6 sm:pl-6',\n        code: cn(\n          'bg-muted relative rounded px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold'\n        ),\n        lead: 'text-muted-foreground text-xl',\n        large: 'text-lg font-semibold',\n        small: 'text-sm font-medium leading-none',\n        muted: 'text-muted-foreground text-sm',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n    },\n  }\n);\n\ntype TextVariantProps = VariantProps<typeof textVariants>;\n\ntype TextVariant = NonNullable<TextVariantProps['variant']>;\n\nconst ROLE: Partial<Record<TextVariant, Role>> = {\n  h1: 'heading',\n  h2: 'heading',\n  h3: 'heading',\n  h4: 'heading',\n  blockquote: Platform.select({ web: 'blockquote' as Role }),\n  code: Platform.select({ web: 'code' as Role }),\n};\n\nconst ARIA_LEVEL: Partial<Record<TextVariant, string>> = {\n  h1: '1',\n  h2: '2',\n  h3: '3',\n  h4: '4',\n};\n\nconst TextClassContext = React.createContext<string | undefined>(undefined);\n\nfunction Text({\n  className,\n  asChild = false,\n  variant = 'default',\n  ...props\n}: React.ComponentProps<typeof RNText> &\n  TextVariantProps &\n  React.RefAttributes<RNText> & {\n    asChild?: boolean;\n  }) {\n  const textClass = React.useContext(TextClassContext);\n  const Component = asChild ? Slot.Text : RNText;\n  return (\n    <Component\n      className={cn(textVariants({ variant }), textClass, className)}\n      role={variant ? ROLE[variant] : undefined}\n      aria-level={variant ? ARIA_LEVEL[variant] : undefined}\n      {...props}\n    />\n  );\n}\n\nexport { Text, TextClassContext };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/textarea.tsx",
    "content": "import { cn } from '@/registry/nativewind/lib/utils';\nimport { Platform, TextInput, type TextInputProps } from 'react-native';\n\nfunction Textarea({\n  className,\n  multiline = true,\n  numberOfLines = Platform.select({ web: 2, native: 8 }), // On web, numberOfLines also determines initial height. On native, it determines the maximum height.\n  placeholderClassName,\n  ...props\n}: TextInputProps & React.RefAttributes<TextInput>) {\n  return (\n    <TextInput\n      className={cn(\n        'text-foreground border-input dark:bg-input/30 flex min-h-16 w-full flex-row rounded-md border bg-transparent px-3 py-2 text-base shadow-sm shadow-black/5 md:text-sm',\n        Platform.select({\n          web: 'placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive field-sizing-content resize-y outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed',\n        }),\n        props.editable === false && 'opacity-50',\n        className\n      )}\n      placeholderClassName={cn('text-muted-foreground', placeholderClassName)}\n      multiline={multiline}\n      numberOfLines={numberOfLines}\n      textAlignVertical=\"top\"\n      {...props}\n    />\n  );\n}\n\nexport { Textarea };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/toggle-group.tsx",
    "content": "import { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { toggleVariants } from '@/registry/nativewind/components/ui/toggle';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as ToggleGroupPrimitive from '@rn-primitives/toggle-group';\nimport type { VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport { Platform } from 'react-native';\n\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants> | null>(null);\n\nfunction ToggleGroup({\n  className,\n  variant,\n  size,\n  children,\n  ...props\n}: ToggleGroupPrimitive.RootProps &\n  VariantProps<typeof toggleVariants> &\n  React.RefAttributes<ToggleGroupPrimitive.RootRef>) {\n  return (\n    <ToggleGroupPrimitive.Root\n      className={cn(\n        'flex flex-row items-center rounded-md shadow-none',\n        Platform.select({ web: 'w-fit' }),\n        variant === 'outline' && 'shadow-sm shadow-black/5',\n        className\n      )}\n      {...props}>\n      <ToggleGroupContext.Provider value={{ variant, size }}>\n        {children}\n      </ToggleGroupContext.Provider>\n    </ToggleGroupPrimitive.Root>\n  );\n}\n\nfunction useToggleGroupContext() {\n  const context = React.useContext(ToggleGroupContext);\n  if (context === null) {\n    throw new Error(\n      'ToggleGroup compound components cannot be rendered outside the ToggleGroup component'\n    );\n  }\n  return context;\n}\n\nfunction ToggleGroupItem({\n  className,\n  children,\n  variant,\n  size,\n  isFirst,\n  isLast,\n  ...props\n}: ToggleGroupPrimitive.ItemProps &\n  VariantProps<typeof toggleVariants> &\n  React.RefAttributes<ToggleGroupPrimitive.ItemRef> & {\n    isFirst?: boolean;\n    isLast?: boolean;\n  }) {\n  const context = useToggleGroupContext();\n  const { value } = ToggleGroupPrimitive.useRootContext();\n\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm text-foreground font-medium',\n        ToggleGroupPrimitive.utils.getIsSelected(value, props.value)\n          ? 'text-accent-foreground'\n          : Platform.select({ web: 'group-hover:text-muted-foreground' })\n      )}>\n      <ToggleGroupPrimitive.Item\n        className={cn(\n          toggleVariants({\n            variant: context.variant || variant,\n            size: context.size || size,\n          }),\n          props.disabled && 'opacity-50',\n          ToggleGroupPrimitive.utils.getIsSelected(value, props.value) && 'bg-accent',\n          'min-w-0 shrink-0 rounded-none shadow-none',\n          isFirst && 'rounded-l-md',\n          isLast && 'rounded-r-md',\n          (context.variant === 'outline' || variant === 'outline') && 'border-l-0',\n          (context.variant === 'outline' || variant === 'outline') && isFirst && 'border-l',\n          Platform.select({\n            web: 'flex-1 focus:z-10 focus-visible:z-10',\n          }),\n          className\n        )}\n        {...props}>\n        {children}\n      </ToggleGroupPrimitive.Item>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction ToggleGroupIcon({ className, ...props }: React.ComponentProps<typeof Icon>) {\n  const textClass = React.useContext(TextClassContext);\n  return <Icon className={cn('size-4 shrink-0', textClass, className)} {...props} />;\n}\n\nexport { ToggleGroup, ToggleGroupIcon, ToggleGroupItem };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/toggle.tsx",
    "content": "import { Icon } from '@/registry/nativewind/components/ui/icon';\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as TogglePrimitive from '@rn-primitives/toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport { Platform } from 'react-native';\n\nconst toggleVariants = cva(\n  cn(\n    'active:bg-muted group flex flex-row items-center justify-center gap-2 rounded-md',\n    Platform.select({\n      web: 'hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex cursor-default whitespace-nowrap outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:pointer-events-none [&_svg]:pointer-events-none',\n    })\n  ),\n  {\n    variants: {\n      variant: {\n        default: 'bg-transparent',\n        outline: cn(\n          'border-input active:bg-accent border bg-transparent shadow-sm shadow-black/5',\n          Platform.select({\n            web: 'hover:bg-accent hover:text-accent-foreground',\n          })\n        ),\n      },\n      size: {\n        default: 'h-10 min-w-10 px-2.5 sm:h-9 sm:min-w-9 sm:px-2',\n        sm: 'h-9 min-w-9 px-2 sm:h-8 sm:min-w-8 sm:px-1.5',\n        lg: 'h-11 min-w-11 px-3 sm:h-10 sm:min-w-10 sm:px-2.5',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n);\n\nfunction Toggle({\n  className,\n  variant,\n  size,\n  ...props\n}: TogglePrimitive.RootProps &\n  VariantProps<typeof toggleVariants> &\n  React.RefAttributes<TogglePrimitive.RootRef>) {\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm text-foreground font-medium',\n        props.pressed\n          ? 'text-accent-foreground'\n          : Platform.select({ web: 'group-hover:text-muted-foreground' }),\n        className\n      )}>\n      <TogglePrimitive.Root\n        className={cn(\n          toggleVariants({ variant, size }),\n          props.disabled && 'opacity-50',\n          props.pressed && 'bg-accent',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction ToggleIcon({ className, ...props }: React.ComponentProps<typeof Icon>) {\n  const textClass = React.useContext(TextClassContext);\n  return <Icon className={cn('size-4 shrink-0', textClass, className)} {...props} />;\n}\n\nexport { Toggle, ToggleIcon, toggleVariants };\n"
  },
  {
    "path": "packages/registry/src/nativewind/components/ui/tooltip.tsx",
    "content": "import { NativeOnlyAnimatedView } from '@/registry/nativewind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/nativewind/components/ui/text';\nimport { cn } from '@/registry/nativewind/lib/utils';\nimport * as TooltipPrimitive from '@rn-primitives/tooltip';\nimport * as React from 'react';\nimport { Platform, StyleSheet } from 'react-native';\nimport { FadeInDown, FadeInUp, FadeOut } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction TooltipContent({\n  className,\n  sideOffset = 4,\n  portalHost,\n  side = 'top',\n  ...props\n}: TooltipPrimitive.ContentProps &\n  React.RefAttributes<TooltipPrimitive.ContentRef> & {\n    portalHost?: string;\n  }) {\n  return (\n    <TooltipPrimitive.Portal hostName={portalHost}>\n      <FullWindowOverlay>\n        <TooltipPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\n          <NativeOnlyAnimatedView\n            entering={\n              side === 'top'\n                ? FadeInDown.withInitialValues({ transform: [{ translateY: 3 }] }).duration(150)\n                : FadeInUp.withInitialValues({ transform: [{ translateY: -5 }] })\n            }\n            exiting={FadeOut}>\n            <TextClassContext.Provider value=\"text-xs text-primary-foreground\">\n              <TooltipPrimitive.Content\n                sideOffset={sideOffset}\n                className={cn(\n                  'bg-primary z-50 rounded-md px-3 py-2 sm:py-1.5',\n                  Platform.select({\n                    web: cn(\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-tooltip-content-transform-origin) w-fit text-balance',\n                      side === 'bottom' && 'slide-in-from-top-2',\n                      side === 'left' && 'slide-in-from-right-2',\n                      side === 'right' && 'slide-in-from-left-2',\n                      side === 'top' && 'slide-in-from-bottom-2'\n                    ),\n                  }),\n                  className\n                )}\n                side={side}\n                {...props}\n              />\n            </TextClassContext.Provider>\n          </NativeOnlyAnimatedView>\n        </TooltipPrimitive.Overlay>\n      </FullWindowOverlay>\n    </TooltipPrimitive.Portal>\n  );\n}\n\nexport { Tooltip, TooltipContent, TooltipTrigger };\n"
  },
  {
    "path": "packages/registry/src/nativewind/lib/index.ts",
    "content": "export * from '@/registry/nativewind/lib/utils';\n"
  },
  {
    "path": "packages/registry/src/nativewind/lib/utils.ts",
    "content": "import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs));\n}\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/accordion.tsx",
    "content": "import { Icon } from '@/registry/uniwind/components/ui/icon';\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as AccordionPrimitive from '@rn-primitives/accordion';\nimport { ChevronDown } from 'lucide-react-native';\nimport { Platform, Pressable, View } from 'react-native';\nimport Animated, {\n  FadeOutUp,\n  LayoutAnimationConfig,\n  LinearTransition,\n  useAnimatedStyle,\n  useDerivedValue,\n  withTiming,\n} from 'react-native-reanimated';\n\nfunction Accordion({\n  children,\n  ...props\n}: Omit<AccordionPrimitive.RootProps, 'asChild'> &\n  React.RefAttributes<AccordionPrimitive.RootRef>) {\n  return (\n    <LayoutAnimationConfig skipEntering>\n      <AccordionPrimitive.Root\n        {...(props as AccordionPrimitive.RootProps)}\n        asChild={Platform.OS !== 'web'}>\n        <Animated.View layout={LinearTransition.duration(200)}>{children}</Animated.View>\n      </AccordionPrimitive.Root>\n    </LayoutAnimationConfig>\n  );\n}\n\nfunction AccordionItem({\n  children,\n  className,\n  value,\n  ...props\n}: AccordionPrimitive.ItemProps & React.RefAttributes<AccordionPrimitive.ItemRef>) {\n  return (\n    <AccordionPrimitive.Item\n      className={cn(\n        'border-border border-b',\n        Platform.select({ web: 'last:border-b-0' }),\n        className\n      )}\n      value={value}\n      asChild\n      {...props}>\n      <Animated.View\n        className=\"native:overflow-hidden\"\n        layout={Platform.select({ native: LinearTransition.duration(200) })}>\n        {children}\n      </Animated.View>\n    </AccordionPrimitive.Item>\n  );\n}\n\nconst Trigger = Platform.OS === 'web' ? View : Pressable;\n\nfunction AccordionTrigger({\n  className,\n  children,\n  ...props\n}: AccordionPrimitive.TriggerProps & {\n  children?: React.ReactNode;\n} & React.RefAttributes<AccordionPrimitive.TriggerRef>) {\n  const { isExpanded } = AccordionPrimitive.useItemContext();\n\n  const progress = useDerivedValue(\n    () => (isExpanded ? withTiming(1, { duration: 250 }) : withTiming(0, { duration: 200 })),\n    [isExpanded]\n  );\n  const chevronStyle = useAnimatedStyle(\n    () => ({\n      transform: [{ rotate: `${progress.value * 180}deg` }],\n    }),\n    [progress]\n  );\n\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-left text-sm font-medium',\n        Platform.select({ web: 'group-hover:underline' })\n      )}>\n      <AccordionPrimitive.Header>\n        <AccordionPrimitive.Trigger {...props} asChild={Platform.OS !== 'web'}>\n          <Trigger\n            className={cn(\n              'flex-row items-start justify-between gap-4 rounded-md py-4 disabled:opacity-50',\n              Platform.select({\n                web: 'focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 outline-none transition-all hover:underline focus-visible:ring-[3px] disabled:pointer-events-none [&[data-state=open]>svg]:rotate-180',\n              }),\n              className\n            )}>\n            <>{children}</>\n            <Animated.View style={chevronStyle}>\n              <Icon\n                as={ChevronDown}\n                size={16}\n                className={cn(\n                  'text-muted-foreground shrink-0',\n                  Platform.select({\n                    web: 'pointer-events-none translate-y-0.5 transition-transform duration-200',\n                  })\n                )}\n              />\n            </Animated.View>\n          </Trigger>\n        </AccordionPrimitive.Trigger>\n      </AccordionPrimitive.Header>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction AccordionContent({\n  className,\n  children,\n  ...props\n}: AccordionPrimitive.ContentProps & React.RefAttributes<AccordionPrimitive.ContentRef>) {\n  const { isExpanded } = AccordionPrimitive.useItemContext();\n  return (\n    <TextClassContext.Provider value=\"text-sm\">\n      <AccordionPrimitive.Content\n        className={cn(\n          'overflow-hidden',\n          Platform.select({\n            web: isExpanded ? 'animate-accordion-down' : 'animate-accordion-up',\n          })\n        )}\n        {...props}>\n        <Animated.View\n          exiting={Platform.select({ native: FadeOutUp.duration(200) })}\n          className={cn('pb-4', className)}>\n          {children}\n        </Animated.View>\n      </AccordionPrimitive.Content>\n    </TextClassContext.Provider>\n  );\n}\n\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/alert-dialog.tsx",
    "content": "import { buttonTextVariants, buttonVariants } from '@/registry/uniwind/components/ui/button';\nimport { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as AlertDialogPrimitive from '@rn-primitives/alert-dialog';\nimport * as React from 'react';\nimport { Platform, View, type ViewProps } from 'react-native';\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst AlertDialog = AlertDialogPrimitive.Root;\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction AlertDialogOverlay({\n  className,\n  children,\n  ...props\n}: Omit<AlertDialogPrimitive.OverlayProps, 'asChild'> &\n  React.RefAttributes<AlertDialogPrimitive.OverlayRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <FullWindowOverlay>\n      <AlertDialogPrimitive.Overlay\n        className={cn(\n          'absolute bottom-0 left-0 right-0 top-0 z-50 flex items-center justify-center bg-black/50 p-2',\n          Platform.select({\n            web: 'animate-in fade-in-0 fixed',\n          }),\n          className\n        )}\n        {...props}>\n        <NativeOnlyAnimatedView\n          entering={FadeIn.duration(200).delay(50)}\n          exiting={FadeOut.duration(150)}>\n          <>{children}</>\n        </NativeOnlyAnimatedView>\n      </AlertDialogPrimitive.Overlay>\n    </FullWindowOverlay>\n  );\n}\n\nfunction AlertDialogContent({\n  className,\n  portalHost,\n  ...props\n}: AlertDialogPrimitive.ContentProps &\n  React.RefAttributes<AlertDialogPrimitive.ContentRef> & {\n    portalHost?: string;\n  }) {\n  return (\n    <AlertDialogPortal hostName={portalHost}>\n      <AlertDialogOverlay>\n        <AlertDialogPrimitive.Content\n          className={cn(\n            'bg-background border-border z-50 flex flex-col gap-4 rounded-lg border p-6 shadow-lg shadow-black/5 sm:max-w-lg',\n            Platform.select({\n              web: 'animate-in fade-in-0 zoom-in-95 web:max-w-[calc(100%-2rem)] duration-200',\n            }),\n            className\n          )}\n          {...props}\n        />\n      </AlertDialogOverlay>\n    </AlertDialogPortal>\n  );\n}\n\nfunction AlertDialogHeader({ className, ...props }: ViewProps) {\n  return (\n    <TextClassContext.Provider value=\"text-center sm:text-left\">\n      <View className={cn('flex flex-col gap-2', className)} {...props} />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction AlertDialogFooter({ className, ...props }: ViewProps) {\n  return (\n    <View\n      className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n      {...props}\n    />\n  );\n}\n\nfunction AlertDialogTitle({\n  className,\n  ...props\n}: AlertDialogPrimitive.TitleProps & React.RefAttributes<AlertDialogPrimitive.TitleRef>) {\n  return (\n    <AlertDialogPrimitive.Title\n      className={cn('text-foreground text-lg font-semibold', className)}\n      {...props}\n    />\n  );\n}\n\nfunction AlertDialogDescription({\n  className,\n  ...props\n}: AlertDialogPrimitive.DescriptionProps &\n  React.RefAttributes<AlertDialogPrimitive.DescriptionRef>) {\n  return (\n    <AlertDialogPrimitive.Description\n      className={cn('text-muted-foreground text-sm', className)}\n      {...props}\n    />\n  );\n}\n\nfunction AlertDialogAction({\n  className,\n  ...props\n}: AlertDialogPrimitive.ActionProps & React.RefAttributes<AlertDialogPrimitive.ActionRef>) {\n  return (\n    <TextClassContext.Provider value={buttonTextVariants({ className })}>\n      <AlertDialogPrimitive.Action className={cn(buttonVariants(), className)} {...props} />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction AlertDialogCancel({\n  className,\n  ...props\n}: AlertDialogPrimitive.CancelProps & React.RefAttributes<AlertDialogPrimitive.CancelRef>) {\n  return (\n    <TextClassContext.Provider value={buttonTextVariants({ className, variant: 'outline' })}>\n      <AlertDialogPrimitive.Cancel\n        className={cn(buttonVariants({ variant: 'outline' }), className)}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nexport {\n  AlertDialog,\n  AlertDialogAction,\n  AlertDialogCancel,\n  AlertDialogContent,\n  AlertDialogDescription,\n  AlertDialogFooter,\n  AlertDialogHeader,\n  AlertDialogOverlay,\n  AlertDialogPortal,\n  AlertDialogTitle,\n  AlertDialogTrigger,\n};\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/alert.tsx",
    "content": "import { Icon } from '@/registry/uniwind/components/ui/icon';\nimport { Text, TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport type { LucideIcon } from 'lucide-react-native';\nimport * as React from 'react';\nimport { View, type ViewProps } from 'react-native';\n\nfunction Alert({\n  className,\n  variant,\n  children,\n  icon,\n  iconClassName,\n  ...props\n}: ViewProps &\n  React.RefAttributes<View> & {\n    icon: LucideIcon;\n    variant?: 'default' | 'destructive';\n    iconClassName?: string;\n  }) {\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm text-foreground',\n        variant === 'destructive' && 'text-destructive',\n        className\n      )}>\n      <View\n        role=\"alert\"\n        className={cn(\n          'bg-card border-border relative w-full rounded-lg border px-4 pb-2 pt-3.5',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-3.5 top-3\">\n          <Icon\n            as={icon}\n            className={cn('size-4', variant === 'destructive' && 'text-destructive', iconClassName)}\n          />\n        </View>\n        {children}\n      </View>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction AlertTitle({\n  className,\n  ...props\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\n  return (\n    <Text\n      className={cn('mb-1 ml-0.5 min-h-4 pl-6 font-medium leading-none tracking-tight', className)}\n      {...props}\n    />\n  );\n}\n\nfunction AlertDescription({\n  className,\n  ...props\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\n  const textClass = React.useContext(TextClassContext);\n  return (\n    <Text\n      className={cn(\n        'text-muted-foreground ml-0.5 pb-1.5 pl-6 text-sm leading-relaxed',\n        textClass?.includes('text-destructive') && 'text-destructive/90',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nexport { Alert, AlertDescription, AlertTitle };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/aspect-ratio.tsx",
    "content": "import * as AspectRatioPrimitive from '@rn-primitives/aspect-ratio';\n\nconst AspectRatio = AspectRatioPrimitive.Root;\n\nexport { AspectRatio };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/avatar.tsx",
    "content": "import { cn } from '@/registry/uniwind/lib/utils';\nimport * as AvatarPrimitive from '@rn-primitives/avatar';\n\nfunction Avatar({\n  className,\n  ...props\n}: AvatarPrimitive.RootProps & React.RefAttributes<AvatarPrimitive.RootRef>) {\n  return (\n    <AvatarPrimitive.Root\n      className={cn('relative flex size-8 shrink-0 overflow-hidden rounded-full', className)}\n      {...props}\n    />\n  );\n}\n\nfunction AvatarImage({\n  className,\n  ...props\n}: AvatarPrimitive.ImageProps & React.RefAttributes<AvatarPrimitive.ImageRef>) {\n  return <AvatarPrimitive.Image className={cn('aspect-square size-full', className)} {...props} />;\n}\n\nfunction AvatarFallback({\n  className,\n  ...props\n}: AvatarPrimitive.FallbackProps & React.RefAttributes<AvatarPrimitive.FallbackRef>) {\n  return (\n    <AvatarPrimitive.Fallback\n      className={cn(\n        'bg-muted flex size-full flex-row items-center justify-center rounded-full',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nexport { Avatar, AvatarFallback, AvatarImage };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/badge.tsx",
    "content": "import { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as Slot from '@rn-primitives/slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Platform, View, ViewProps } from 'react-native';\n\nconst badgeVariants = cva(\n  cn(\n    'border-border group shrink-0 flex-row items-center justify-center gap-1 overflow-hidden rounded-full border px-2 py-0.5',\n    Platform.select({\n      web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive w-fit whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] [&>svg]:pointer-events-none [&>svg]:size-3',\n    })\n  ),\n  {\n    variants: {\n      variant: {\n        default: cn(\n          'bg-primary border-transparent',\n          Platform.select({ web: '[a&]:hover:bg-primary/90' })\n        ),\n        secondary: cn(\n          'bg-secondary border-transparent',\n          Platform.select({ web: '[a&]:hover:bg-secondary/90' })\n        ),\n        destructive: cn(\n          'bg-destructive border-transparent',\n          Platform.select({ web: '[a&]:hover:bg-destructive/90' })\n        ),\n        outline: Platform.select({ web: '[a&]:hover:bg-accent [a&]:hover:text-accent-foreground' }),\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n    },\n  }\n);\n\nconst badgeTextVariants = cva('text-xs font-medium', {\n  variants: {\n    variant: {\n      default: 'text-primary-foreground',\n      secondary: 'text-secondary-foreground',\n      destructive: 'text-white',\n      outline: 'text-foreground',\n    },\n  },\n  defaultVariants: {\n    variant: 'default',\n  },\n});\n\ntype BadgeProps = ViewProps &\n  React.RefAttributes<View> & {\n    asChild?: boolean;\n  } & VariantProps<typeof badgeVariants>;\n\nfunction Badge({ className, variant, asChild, ...props }: BadgeProps) {\n  const Component = asChild ? Slot.View : View;\n  return (\n    <TextClassContext.Provider value={badgeTextVariants({ variant })}>\n      <Component className={cn(badgeVariants({ variant }), className)} {...props} />\n    </TextClassContext.Provider>\n  );\n}\n\nexport { Badge, badgeTextVariants, badgeVariants };\nexport type { BadgeProps };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/button.tsx",
    "content": "import { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Platform, Pressable } from 'react-native';\n\n// NOTE: group-* is not supported yet by Uniwind\n\nconst buttonVariants = cva(\n  cn(\n    'group shrink-0 flex-row items-center justify-center gap-2 rounded-md shadow-none',\n    Platform.select({\n      web: \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap outline-none transition-all focus-visible:ring-[3px] disabled:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n    })\n  ),\n  {\n    variants: {\n      variant: {\n        default: cn(\n          'bg-primary active:bg-primary/90 shadow-sm shadow-black/5',\n          Platform.select({ web: 'hover:bg-primary/90' })\n        ),\n        destructive: cn(\n          'bg-destructive active:bg-destructive/90 dark:bg-destructive/60 shadow-sm shadow-black/5',\n          Platform.select({\n            web: 'hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',\n          })\n        ),\n        outline: cn(\n          'border-border bg-background active:bg-accent dark:bg-input/30 dark:border-input dark:active:bg-input/50 border shadow-sm shadow-black/5',\n          Platform.select({\n            web: 'hover:bg-accent dark:hover:bg-input/50',\n          })\n        ),\n        secondary: cn(\n          'bg-secondary active:bg-secondary/80 shadow-sm shadow-black/5',\n          Platform.select({ web: 'hover:bg-secondary/80' })\n        ),\n        ghost: cn(\n          'active:bg-accent dark:active:bg-accent/50',\n          Platform.select({ web: 'hover:bg-accent dark:hover:bg-accent/50' })\n        ),\n        link: '',\n      },\n      size: {\n        default: cn('h-10 px-4 py-2 sm:h-9', Platform.select({ web: 'has-[>svg]:px-3' })),\n        sm: cn('h-9 gap-1.5 rounded-md px-3 sm:h-8', Platform.select({ web: 'has-[>svg]:px-2.5' })),\n        lg: cn('h-11 rounded-md px-6 sm:h-10', Platform.select({ web: 'has-[>svg]:px-4' })),\n        icon: 'h-10 w-10 sm:h-9 sm:w-9',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n);\n\nconst buttonTextVariants = cva(\n  cn(\n    'text-foreground text-sm font-medium',\n    Platform.select({ web: 'pointer-events-none transition-colors' })\n  ),\n  {\n    variants: {\n      variant: {\n        default: 'text-primary-foreground',\n        destructive: 'text-white',\n        outline: cn(\n          'group-active:text-accent-foreground',\n          Platform.select({ web: 'group-hover:text-accent-foreground' })\n        ),\n        secondary: 'text-secondary-foreground',\n        ghost: 'group-active:text-accent-foreground',\n        link: cn(\n          'text-primary group-active:underline',\n          Platform.select({ web: 'underline-offset-4 hover:underline group-hover:underline' })\n        ),\n      },\n      size: {\n        default: '',\n        sm: '',\n        lg: '',\n        icon: '',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n);\n\ntype ButtonProps = React.ComponentProps<typeof Pressable> &\n  React.RefAttributes<typeof Pressable> &\n  VariantProps<typeof buttonVariants>;\n\nfunction Button({ className, variant, size, ...props }: ButtonProps) {\n  return (\n    <TextClassContext.Provider value={buttonTextVariants({ variant, size })}>\n      <Pressable\n        className={cn(props.disabled && 'opacity-50', buttonVariants({ variant, size }), className)}\n        role=\"button\"\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nexport { Button, buttonTextVariants, buttonVariants };\nexport type { ButtonProps };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/card.tsx",
    "content": "import { Text, TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport { View, type ViewProps } from 'react-native';\n\nfunction Card({ className, ...props }: ViewProps & React.RefAttributes<View>) {\n  return (\n    <TextClassContext.Provider value=\"text-card-foreground\">\n      <View\n        className={cn(\n          'bg-card border-border flex flex-col gap-6 rounded-xl border py-6 shadow-sm shadow-black/5',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction CardHeader({ className, ...props }: ViewProps & React.RefAttributes<View>) {\n  return <View className={cn('flex flex-col gap-1.5 px-6', className)} {...props} />;\n}\n\nfunction CardTitle({\n  className,\n  ...props\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\n  return (\n    <Text\n      role=\"heading\"\n      aria-level={3}\n      className={cn('font-semibold leading-none', className)}\n      {...props}\n    />\n  );\n}\n\nfunction CardDescription({\n  className,\n  ...props\n}: React.ComponentProps<typeof Text> & React.RefAttributes<Text>) {\n  return <Text className={cn('text-muted-foreground text-sm', className)} {...props} />;\n}\n\nfunction CardContent({ className, ...props }: ViewProps & React.RefAttributes<View>) {\n  return <View className={cn('px-6', className)} {...props} />;\n}\n\nfunction CardFooter({ className, ...props }: ViewProps & React.RefAttributes<View>) {\n  return <View className={cn('flex flex-row items-center px-6', className)} {...props} />;\n}\n\nexport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/checkbox.tsx",
    "content": "import { Icon } from '@/registry/uniwind/components/ui/icon';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as CheckboxPrimitive from '@rn-primitives/checkbox';\nimport { Check } from 'lucide-react-native';\nimport { Platform } from 'react-native';\n\nconst DEFAULT_HIT_SLOP = 24;\n\nfunction Checkbox({\n  className,\n  checkedClassName,\n  indicatorClassName,\n  iconClassName,\n  ...props\n}: CheckboxPrimitive.RootProps &\n  React.RefAttributes<CheckboxPrimitive.RootRef> & {\n    checkedClassName?: string;\n    indicatorClassName?: string;\n    iconClassName?: string;\n  }) {\n  return (\n    <CheckboxPrimitive.Root\n      className={cn(\n        'border-input dark:bg-input/30 size-4 shrink-0 rounded-[4px] border shadow-sm shadow-black/5',\n        Platform.select({\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive peer cursor-default outline-none transition-shadow focus-visible:ring-[3px] disabled:cursor-not-allowed',\n          native: 'overflow-hidden',\n        }),\n        props.checked && cn('border-primary', checkedClassName),\n        props.disabled && 'opacity-50',\n        className\n      )}\n      hitSlop={DEFAULT_HIT_SLOP}\n      {...props}>\n      <CheckboxPrimitive.Indicator\n        className={cn('bg-primary h-full w-full items-center justify-center', indicatorClassName)}>\n        <Icon\n          as={Check}\n          size={12}\n          strokeWidth={Platform.OS === 'web' ? 2.5 : 3.5}\n          className={cn('text-primary-foreground', iconClassName)}\n        />\n      </CheckboxPrimitive.Indicator>\n    </CheckboxPrimitive.Root>\n  );\n}\n\nexport { Checkbox };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/collapsible.tsx",
    "content": "import * as CollapsiblePrimitive from '@rn-primitives/collapsible';\n\nconst Collapsible = CollapsiblePrimitive.Root;\n\nconst CollapsibleTrigger = CollapsiblePrimitive.Trigger;\n\nconst CollapsibleContent = CollapsiblePrimitive.Content;\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/context-menu.tsx",
    "content": "import { Icon } from '@/registry/uniwind/components/ui/icon';\nimport { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as ContextMenuPrimitive from '@rn-primitives/context-menu';\nimport { Check, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react-native';\nimport * as React from 'react';\nimport {\n  Platform,\n  type StyleProp,\n  StyleSheet,\n  Text,\n  type TextProps,\n  View,\n  type ViewStyle,\n} from 'react-native';\nimport { FadeIn } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst ContextMenu = ContextMenuPrimitive.Root;\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger;\nconst ContextMenuGroup = ContextMenuPrimitive.Group;\nconst ContextMenuSub = ContextMenuPrimitive.Sub;\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;\n\nfunction ContextMenuSubTrigger({\n  className,\n  inset,\n  children,\n  iconClassName,\n  ...props\n}: ContextMenuPrimitive.SubTriggerProps &\n  React.RefAttributes<ContextMenuPrimitive.SubTriggerRef> & {\n    children?: React.ReactNode;\n    iconClassName?: string;\n    inset?: boolean;\n  }) {\n  const { open } = ContextMenuPrimitive.useSubContext();\n  const icon = Platform.OS === 'web' ? ChevronRight : open ? ChevronUp : ChevronDown;\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm select-none group-active:text-accent-foreground',\n        open && 'text-accent-foreground'\n      )}>\n      <ContextMenuPrimitive.SubTrigger\n        className={cn(\n          'active:bg-accent group flex flex-row items-center justify-between rounded-sm px-2 py-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none [&_svg]:pointer-events-none',\n          }),\n          className,\n          open && cn('bg-accent', Platform.select({ native: 'mb-1' })),\n          inset && 'pl-8'\n        )}\n        {...props}>\n        <>{children}</>\n        <Icon as={icon} className={cn('text-foreground size-4 shrink-0', iconClassName)} />\n      </ContextMenuPrimitive.SubTrigger>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction ContextMenuSubContent({\n  className,\n  ...props\n}: ContextMenuPrimitive.SubContentProps & React.RefAttributes<ContextMenuPrimitive.SubContentRef>) {\n  return (\n    <NativeOnlyAnimatedView entering={FadeIn}>\n      <ContextMenuPrimitive.SubContent\n        className={cn(\n          'bg-popover border-border overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\n          Platform.select({\n            web: 'animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fade-in-0 data-[state=closed]:zoom-out-95 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 origin-(--radix-context-menu-content-transform-origin) z-50 min-w-[8rem]',\n          }),\n          className\n        )}\n        {...props}\n      />\n    </NativeOnlyAnimatedView>\n  );\n}\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction ContextMenuContent({\n  className,\n  overlayClassName,\n  overlayStyle,\n  portalHost,\n  ...props\n}: ContextMenuPrimitive.ContentProps &\n  React.RefAttributes<ContextMenuPrimitive.ContentRef> & {\n    overlayStyle?: StyleProp<ViewStyle>;\n    overlayClassName?: string;\n    portalHost?: string;\n  }) {\n  return (\n    <ContextMenuPrimitive.Portal hostName={portalHost}>\n      <FullWindowOverlay>\n        <ContextMenuPrimitive.Overlay\n          style={Platform.select({\n            web: overlayStyle ?? undefined,\n            native: overlayStyle\n              ? StyleSheet.flatten([\n                StyleSheet.absoluteFill,\n                overlayStyle as typeof StyleSheet.absoluteFill,\n              ])\n              : StyleSheet.absoluteFill,\n          })}\n          className={overlayClassName}>\n          <NativeOnlyAnimatedView entering={FadeIn}>\n            <TextClassContext.Provider value=\"text-popover-foreground\">\n              <ContextMenuPrimitive.Content\n                className={cn(\n                  'bg-popover border-border min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\n                  Platform.select({\n                    web: cn(\n                      'animate-in fade-in-0 zoom-in-95 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) z-50 cursor-default',\n                      props.side === 'bottom' && 'slide-in-from-top-2',\n                      props.side === 'top' && 'slide-in-from-bottom-2'\n                    ),\n                  }),\n                  className\n                )}\n                {...props}\n              />\n            </TextClassContext.Provider>\n          </NativeOnlyAnimatedView>\n        </ContextMenuPrimitive.Overlay>\n      </FullWindowOverlay>\n    </ContextMenuPrimitive.Portal>\n  );\n}\n\nfunction ContextMenuItem({\n  className,\n  inset,\n  variant,\n  ...props\n}: ContextMenuPrimitive.ItemProps &\n  React.RefAttributes<ContextMenuPrimitive.ItemRef> & {\n    className?: string;\n    inset?: boolean;\n    variant?: 'default' | 'destructive';\n  }) {\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'select-none text-sm text-popover-foreground group-active:text-popover-foreground',\n        variant === 'destructive' && 'text-destructive group-active:text-destructive'\n      )}>\n      <ContextMenuPrimitive.Item\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm px-2 py-2 sm:py-1.5',\n          Platform.select({\n            web: cn(\n              'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n              variant === 'destructive' && 'focus:bg-destructive/10 dark:focus:bg-destructive/20'\n            ),\n          }),\n          variant === 'destructive' && 'active:bg-destructive/10 dark:active:bg-destructive/20',\n          props.disabled && 'opacity-50',\n          inset && 'pl-8',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction ContextMenuCheckboxItem({\n  className,\n  children,\n  ...props\n}: ContextMenuPrimitive.CheckboxItemProps &\n  React.RefAttributes<ContextMenuPrimitive.CheckboxItemRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <TextClassContext.Provider value=\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\">\n      <ContextMenuPrimitive.CheckboxItem\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n          }),\n          props.disabled && 'opacity-50',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n          <ContextMenuPrimitive.ItemIndicator>\n            <Icon\n              as={Check}\n              className={cn(\n                'text-foreground size-4',\n                Platform.select({ web: 'pointer-events-none' })\n              )}\n            />\n          </ContextMenuPrimitive.ItemIndicator>\n        </View>\n        <>{children}</>\n      </ContextMenuPrimitive.CheckboxItem>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction ContextMenuRadioItem({\n  className,\n  children,\n  ...props\n}: ContextMenuPrimitive.RadioItemProps &\n  React.RefAttributes<ContextMenuPrimitive.RadioItemRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <TextClassContext.Provider value=\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\">\n      <ContextMenuPrimitive.RadioItem\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n          }),\n          props.disabled && 'opacity-50',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n          <ContextMenuPrimitive.ItemIndicator>\n            <View className=\"bg-foreground h-2 w-2 rounded-full\" />\n          </ContextMenuPrimitive.ItemIndicator>\n        </View>\n        <>{children}</>\n      </ContextMenuPrimitive.RadioItem>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction ContextMenuLabel({\n  className,\n  inset,\n  ...props\n}: ContextMenuPrimitive.LabelProps &\n  React.RefAttributes<ContextMenuPrimitive.LabelRef> & {\n    className?: string;\n    inset?: boolean;\n  }) {\n  return (\n    <ContextMenuPrimitive.Label\n      className={cn(\n        'text-foreground px-2 py-2 text-sm font-medium sm:py-1.5',\n        inset && 'pl-8',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction ContextMenuSeparator({\n  className,\n  ...props\n}: ContextMenuPrimitive.SeparatorProps & React.RefAttributes<ContextMenuPrimitive.SeparatorRef>) {\n  return (\n    <ContextMenuPrimitive.Separator\n      className={cn('bg-border -mx-1 my-1 h-px', className)}\n      {...props}\n    />\n  );\n}\n\nfunction ContextMenuShortcut({ className, ...props }: TextProps & React.RefAttributes<Text>) {\n  return (\n    <Text\n      className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\n      {...props}\n    />\n  );\n}\n\nexport {\n  ContextMenu,\n  ContextMenuCheckboxItem,\n  ContextMenuContent,\n  ContextMenuGroup,\n  ContextMenuItem,\n  ContextMenuLabel,\n  ContextMenuRadioGroup,\n  ContextMenuRadioItem,\n  ContextMenuSeparator,\n  ContextMenuShortcut,\n  ContextMenuSub,\n  ContextMenuSubContent,\n  ContextMenuSubTrigger,\n  ContextMenuTrigger,\n};\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/dialog.tsx",
    "content": "import { Icon } from '@/registry/uniwind/components/ui/icon';\nimport { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as DialogPrimitive from '@rn-primitives/dialog';\nimport { X } from 'lucide-react-native';\nimport * as React from 'react';\nimport { Platform, Text, View, type ViewProps } from 'react-native';\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction DialogOverlay({\n  className,\n  children,\n  ...props\n}: Omit<DialogPrimitive.OverlayProps, 'asChild'> &\n  React.RefAttributes<DialogPrimitive.OverlayRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <FullWindowOverlay>\n      <DialogPrimitive.Overlay\n        className={cn(\n          'absolute bottom-0 left-0 right-0 top-0 z-50 flex items-center justify-center bg-black/50 p-2',\n          Platform.select({\n            web: 'animate-in fade-in-0 fixed cursor-default [&>*]:cursor-auto',\n          }),\n          className\n        )}\n        {...props}\n        asChild={Platform.OS !== 'web'}>\n        <NativeOnlyAnimatedView entering={FadeIn.duration(200)} exiting={FadeOut.duration(150)}>\n          <NativeOnlyAnimatedView entering={FadeIn.delay(50)} exiting={FadeOut.duration(150)}>\n            <>{children}</>\n          </NativeOnlyAnimatedView>\n        </NativeOnlyAnimatedView>\n      </DialogPrimitive.Overlay>\n    </FullWindowOverlay>\n  );\n}\nfunction DialogContent({\n  className,\n  portalHost,\n  children,\n  ...props\n}: DialogPrimitive.ContentProps &\n  React.RefAttributes<DialogPrimitive.ContentRef> & {\n    portalHost?: string;\n  }) {\n  return (\n    <DialogPortal hostName={portalHost}>\n      <DialogOverlay>\n        <DialogPrimitive.Content\n          className={cn(\n            'bg-background border-border z-50 mx-auto flex w-full flex-col gap-4 rounded-lg border p-6 shadow-lg shadow-black/5 sm:max-w-lg',\n            Platform.select({\n              web: 'animate-in fade-in-0 zoom-in-95 web:max-w-[calc(100%-2rem)] duration-200',\n            }),\n            className\n          )}\n          {...props}>\n          <>{children}</>\n          <DialogPrimitive.Close\n            className={cn(\n              'absolute right-4 top-4 rounded opacity-70 active:opacity-100',\n              Platform.select({\n                web: 'ring-offset-background focus:ring-ring data-[state=open]:bg-accent transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-offset-2',\n              })\n            )}\n            hitSlop={12}>\n            <Icon\n              as={X}\n              className={cn('text-accent-foreground web:pointer-events-none size-4 shrink-0')}\n            />\n            <Text className=\"sr-only\">Close</Text>\n          </DialogPrimitive.Close>\n        </DialogPrimitive.Content>\n      </DialogOverlay>\n    </DialogPortal>\n  );\n}\n\nfunction DialogHeader({ className, ...props }: ViewProps) {\n  return (\n    <View className={cn('flex flex-col gap-2 text-center sm:text-left', className)} {...props} />\n  );\n}\n\nfunction DialogFooter({ className, ...props }: ViewProps) {\n  return (\n    <View\n      className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n      {...props}\n    />\n  );\n}\n\nfunction DialogTitle({\n  className,\n  ...props\n}: DialogPrimitive.TitleProps & React.RefAttributes<DialogPrimitive.TitleRef>) {\n  return (\n    <DialogPrimitive.Title\n      className={cn('text-foreground text-lg font-semibold leading-none', className)}\n      {...props}\n    />\n  );\n}\n\nfunction DialogDescription({\n  className,\n  ...props\n}: DialogPrimitive.DescriptionProps & React.RefAttributes<DialogPrimitive.DescriptionRef>) {\n  return (\n    <DialogPrimitive.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": "packages/registry/src/uniwind/components/ui/dropdown-menu.tsx",
    "content": "import { Icon } from '@/registry/uniwind/components/ui/icon';\nimport { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as DropdownMenuPrimitive from '@rn-primitives/dropdown-menu';\nimport { Check, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react-native';\nimport * as React from 'react';\nimport {\n  Platform,\n  type StyleProp,\n  StyleSheet,\n  Text,\n  type TextProps,\n  View,\n  type ViewStyle,\n} from 'react-native';\nimport { FadeIn } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nfunction DropdownMenuSubTrigger({\n  className,\n  inset,\n  children,\n  iconClassName,\n  ...props\n}: DropdownMenuPrimitive.SubTriggerProps &\n  React.RefAttributes<DropdownMenuPrimitive.SubTriggerRef> & {\n    children?: React.ReactNode;\n    iconClassName?: string;\n    inset?: boolean;\n  }) {\n  const { open } = DropdownMenuPrimitive.useSubContext();\n  const icon = Platform.OS === 'web' ? ChevronRight : open ? ChevronUp : ChevronDown;\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm select-none group-active:text-accent-foreground',\n        open && 'text-accent-foreground'\n      )}>\n      <DropdownMenuPrimitive.SubTrigger\n        className={cn(\n          'active:bg-accent group flex flex-row items-center justify-between rounded-sm px-2 py-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none [&_svg]:pointer-events-none',\n          }),\n          className,\n          open && 'bg-accent',\n          inset && 'pl-8'\n        )}\n        {...props}>\n        <>{children}</>\n        <Icon as={icon} className={cn('text-foreground size-4 shrink-0', iconClassName)} />\n      </DropdownMenuPrimitive.SubTrigger>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction DropdownMenuSubContent({\n  className,\n  ...props\n}: DropdownMenuPrimitive.SubContentProps &\n  React.RefAttributes<DropdownMenuPrimitive.SubContentRef>) {\n  return (\n    <NativeOnlyAnimatedView entering={FadeIn}>\n      <DropdownMenuPrimitive.SubContent\n        className={cn(\n          'bg-popover border-border overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\n          Platform.select({\n            web: 'animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fade-in-0 data-[state=closed]:zoom-out-95 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 origin-(--radix-context-menu-content-transform-origin) z-50 min-w-[8rem]',\n          }),\n          className\n        )}\n        {...props}\n      />\n    </NativeOnlyAnimatedView>\n  );\n}\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction DropdownMenuContent({\n  className,\n  overlayClassName,\n  overlayStyle,\n  portalHost,\n  ...props\n}: DropdownMenuPrimitive.ContentProps &\n  React.RefAttributes<DropdownMenuPrimitive.ContentRef> & {\n    overlayStyle?: StyleProp<ViewStyle>;\n    overlayClassName?: string;\n    portalHost?: string;\n  }) {\n  return (\n    <DropdownMenuPrimitive.Portal hostName={portalHost}>\n      <FullWindowOverlay>\n        <DropdownMenuPrimitive.Overlay\n          style={Platform.select({\n            web: overlayStyle ?? undefined,\n            native: overlayStyle\n              ? StyleSheet.flatten([\n                StyleSheet.absoluteFill,\n                overlayStyle as typeof StyleSheet.absoluteFill,\n              ])\n              : StyleSheet.absoluteFill,\n          })}\n          className={overlayClassName}>\n          <NativeOnlyAnimatedView entering={FadeIn}>\n            <TextClassContext.Provider value=\"text-popover-foreground\">\n              <DropdownMenuPrimitive.Content\n                className={cn(\n                  'bg-popover border-border min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\n                  Platform.select({\n                    web: cn(\n                      'animate-in fade-in-0 zoom-in-95 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) z-50 cursor-default',\n                      props.side === 'bottom' && 'slide-in-from-top-2',\n                      props.side === 'top' && 'slide-in-from-bottom-2'\n                    ),\n                  }),\n                  className\n                )}\n                {...props}\n              />\n            </TextClassContext.Provider>\n          </NativeOnlyAnimatedView>\n        </DropdownMenuPrimitive.Overlay>\n      </FullWindowOverlay>\n    </DropdownMenuPrimitive.Portal>\n  );\n}\n\nfunction DropdownMenuItem({\n  className,\n  inset,\n  variant,\n  ...props\n}: DropdownMenuPrimitive.ItemProps &\n  React.RefAttributes<DropdownMenuPrimitive.ItemRef> & {\n    className?: string;\n    inset?: boolean;\n    variant?: 'default' | 'destructive';\n  }) {\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'select-none text-sm text-popover-foreground group-active:text-popover-foreground',\n        variant === 'destructive' && 'text-destructive group-active:text-destructive'\n      )}>\n      <DropdownMenuPrimitive.Item\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm px-2 py-2 sm:py-1.5',\n          Platform.select({\n            web: cn(\n              'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n              variant === 'destructive' && 'focus:bg-destructive/10 dark:focus:bg-destructive/20'\n            ),\n          }),\n          variant === 'destructive' && 'active:bg-destructive/10 dark:active:bg-destructive/20',\n          props.disabled && 'opacity-50',\n          inset && 'pl-8',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction DropdownMenuCheckboxItem({\n  className,\n  children,\n  ...props\n}: DropdownMenuPrimitive.CheckboxItemProps &\n  React.RefAttributes<DropdownMenuPrimitive.CheckboxItemRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <TextClassContext.Provider value=\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\">\n      <DropdownMenuPrimitive.CheckboxItem\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n          }),\n          props.disabled && 'opacity-50',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n          <DropdownMenuPrimitive.ItemIndicator>\n            <Icon\n              as={Check}\n              className={cn(\n                'text-foreground size-4',\n                Platform.select({ web: 'pointer-events-none' })\n              )}\n            />\n          </DropdownMenuPrimitive.ItemIndicator>\n        </View>\n        <>{children}</>\n      </DropdownMenuPrimitive.CheckboxItem>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction DropdownMenuRadioItem({\n  className,\n  children,\n  ...props\n}: DropdownMenuPrimitive.RadioItemProps &\n  React.RefAttributes<DropdownMenuPrimitive.RadioItemRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <TextClassContext.Provider value=\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\">\n      <DropdownMenuPrimitive.RadioItem\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n          }),\n          props.disabled && 'opacity-50',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n          <DropdownMenuPrimitive.ItemIndicator>\n            <View className=\"bg-foreground h-2 w-2 rounded-full\" />\n          </DropdownMenuPrimitive.ItemIndicator>\n        </View>\n        <>{children}</>\n      </DropdownMenuPrimitive.RadioItem>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction DropdownMenuLabel({\n  className,\n  inset,\n  ...props\n}: DropdownMenuPrimitive.LabelProps &\n  React.RefAttributes<DropdownMenuPrimitive.LabelRef> & {\n    className?: string;\n    inset?: boolean;\n  }) {\n  return (\n    <DropdownMenuPrimitive.Label\n      className={cn(\n        'text-foreground px-2 py-2 text-sm font-medium sm:py-1.5',\n        inset && 'pl-8',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuSeparator({\n  className,\n  ...props\n}: DropdownMenuPrimitive.SeparatorProps & React.RefAttributes<DropdownMenuPrimitive.SeparatorRef>) {\n  return (\n    <DropdownMenuPrimitive.Separator\n      className={cn('bg-border -mx-1 my-1 h-px', className)}\n      {...props}\n    />\n  );\n}\n\nfunction DropdownMenuShortcut({ className, ...props }: TextProps & React.RefAttributes<Text>) {\n  return (\n    <Text\n      className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\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": "packages/registry/src/uniwind/components/ui/hover-card.tsx",
    "content": "import { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as HoverCardPrimitive from '@rn-primitives/hover-card';\nimport * as React from 'react';\nimport { Platform, StyleSheet } from 'react-native';\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst HoverCard = HoverCardPrimitive.Root;\n\nconst HoverCardTrigger = HoverCardPrimitive.Trigger;\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction HoverCardContent({\n  className,\n  align = 'center',\n  sideOffset = 4,\n  ...props\n}: HoverCardPrimitive.ContentProps & React.RefAttributes<HoverCardPrimitive.ContentRef>) {\n  return (\n    <HoverCardPrimitive.Portal>\n      <FullWindowOverlay>\n        <HoverCardPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\n          <NativeOnlyAnimatedView entering={FadeIn} exiting={FadeOut}>\n            <TextClassContext.Provider value=\"text-popover-foreground\">\n              <HoverCardPrimitive.Content\n                align={align}\n                sideOffset={sideOffset}\n                className={cn(\n                  'bg-popover border-border outline-hidden z-50 w-64 rounded-md border p-4 shadow-md shadow-black/5',\n                  Platform.select({\n                    web: cn(\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-hover-card-content-transform-origin) cursor-default [&>*]:cursor-auto',\n                      props.side === 'bottom' && 'slide-in-from-top-2',\n                      props.side === 'top' && 'slide-in-from-bottom-2'\n                    ),\n                  }),\n                  className\n                )}\n                {...props}\n              />\n            </TextClassContext.Provider>\n          </NativeOnlyAnimatedView>\n        </HoverCardPrimitive.Overlay>\n      </FullWindowOverlay>\n    </HoverCardPrimitive.Portal>\n  );\n}\n\nexport { HoverCard, HoverCardContent, HoverCardTrigger };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/icon.tsx",
    "content": "import { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport type { LucideIcon, LucideProps } from 'lucide-react-native';\nimport * as React from 'react';\nimport { withUniwind } from 'uniwind';\n\ntype IconProps = LucideProps & {\n  as: LucideIcon;\n};\n\nfunction IconImpl({ as: IconComponent, ...props }: IconProps) {\n  return <IconComponent {...props} />;\n}\n\nconst StyledIcon = withUniwind(IconImpl, {\n  size: {\n    fromClassName: 'className',\n    styleProperty: 'width',\n  },\n  color: {\n    fromClassName: 'className',\n    styleProperty: 'color',\n  },\n});\n\n/**\n * A wrapper component for Lucide icons with Uniwind `className` support via `withUniwind`.\n *\n * This component allows you to render any Lucide icon while applying utility classes\n * using `uniwind`. It avoids the need to wrap or configure each icon individually.\n *\n * @component\n * @example\n * ```tsx\n * import { ArrowRight } from 'lucide-react-native';\n * import { Icon } from '@/registry/uniwind/registry/components/ui/icon';\n *\n * <Icon as={ArrowRight} className=\"text-red-500 size-4\" />\n * ```\n *\n * @param {LucideIcon} as - The Lucide icon component to render.\n * @param {string} className - Utility classes to style the icon using Uniwind.\n * @param {number} size - Icon size (overrides the size class).\n * @param {...LucideProps} ...props - Additional Lucide icon props passed to the \"as\" icon.\n */\nfunction Icon({ as: IconComponent, className, ...props }: IconProps) {\n  const textClass = React.useContext(TextClassContext);\n  return (\n    <StyledIcon as={IconComponent} className={cn('text-foreground size-5', textClass, className)} {...props} />\n  );\n}\n\nexport { Icon };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/input.tsx",
    "content": "import { cn } from '@/registry/uniwind/lib/utils';\nimport { Platform, TextInput, type TextInputProps } from 'react-native';\n\nfunction Input({\n  className,\n  placeholderClassName,\n  ...props\n}: TextInputProps & React.RefAttributes<TextInput>) {\n  return (\n    <TextInput\n      className={cn(\n        'dark:bg-input/30 border-input bg-background text-foreground flex h-10 w-full min-w-0 flex-row items-center rounded-md border px-3 py-1 text-base leading-5 shadow-sm shadow-black/5 sm:h-9',\n        props.editable === false &&\n          cn(\n            'opacity-50',\n            Platform.select({ web: 'disabled:pointer-events-none disabled:cursor-not-allowed' })\n          ),\n        Platform.select({\n          web: cn(\n            'placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground outline-none transition-[color,box-shadow] md:text-sm',\n            'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n            'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive'\n          ),\n          native: 'placeholder:text-muted-foreground/50',\n        }),\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nexport { Input };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/label.tsx",
    "content": "import { cn } from '@/registry/uniwind/lib/utils';\nimport * as LabelPrimitive from '@rn-primitives/label';\nimport { Platform } from 'react-native';\n\nfunction Label({\n  className,\n  onPress,\n  onLongPress,\n  onPressIn,\n  onPressOut,\n  disabled,\n  ...props\n}: LabelPrimitive.TextProps & React.RefAttributes<LabelPrimitive.TextRef>) {\n  return (\n    <LabelPrimitive.Root\n      className={cn(\n        'flex select-none flex-row items-center gap-2',\n        Platform.select({\n          web: 'cursor-default leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-50 group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50',\n        }),\n        disabled && 'opacity-50'\n      )}\n      onPress={onPress}\n      onLongPress={onLongPress}\n      onPressIn={onPressIn}\n      onPressOut={onPressOut}\n      disabled={disabled}>\n      <LabelPrimitive.Text\n        className={cn(\n          'text-foreground text-sm font-medium',\n          Platform.select({ web: 'leading-none' }),\n          className\n        )}\n        {...props}\n      />\n    </LabelPrimitive.Root>\n  );\n}\n\nexport { Label };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/menubar.tsx",
    "content": "import { Icon } from '@/registry/uniwind/components/ui/icon';\nimport { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as MenubarPrimitive from '@rn-primitives/menubar';\nimport { Portal } from '@rn-primitives/portal';\nimport { Check, ChevronDown, ChevronRight, ChevronUp } from 'lucide-react-native';\nimport * as React from 'react';\nimport {\n  Platform,\n  Pressable,\n  type StyleProp,\n  StyleSheet,\n  Text,\n  type TextProps,\n  View,\n  type ViewStyle,\n} from 'react-native';\nimport { FadeIn } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst MenubarMenu = MenubarPrimitive.Menu;\n\nconst MenubarGroup = MenubarPrimitive.Group;\n\nconst MenubarPortal = MenubarPrimitive.Portal;\n\nconst MenubarSub = MenubarPrimitive.Sub;\n\nconst MenubarRadioGroup = MenubarPrimitive.RadioGroup;\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction Menubar({\n  className,\n  value: valueProp,\n  onValueChange: onValueChangeProp,\n  ...props\n}: MenubarPrimitive.RootProps & React.RefAttributes<MenubarPrimitive.RootRef>) {\n  const id = React.useId();\n  const [value, setValue] = React.useState<string | undefined>(undefined);\n\n  function closeMenu() {\n    if (onValueChangeProp) {\n      onValueChangeProp(undefined);\n      return;\n    }\n    setValue(undefined);\n  }\n\n  return (\n    <>\n      {Platform.OS !== 'web' && (value || valueProp) ? (\n        <Portal name={`menubar-overlay-${id}`}>\n          <Pressable onPress={closeMenu} style={StyleSheet.absoluteFill} />\n        </Portal>\n      ) : null}\n      <MenubarPrimitive.Root\n        className={cn(\n          'bg-background border-border flex h-10 flex-row items-center gap-1 rounded-md border p-1 shadow-sm shadow-black/5 sm:h-9',\n          className\n        )}\n        value={value ?? valueProp}\n        onValueChange={onValueChangeProp ?? setValue}\n        {...props}\n      />\n    </>\n  );\n}\n\nfunction MenubarTrigger({\n  className,\n  ...props\n}: MenubarPrimitive.TriggerProps & React.RefAttributes<MenubarPrimitive.TriggerRef>) {\n  const { value } = MenubarPrimitive.useRootContext();\n  const { value: itemValue } = MenubarPrimitive.useMenuContext();\n\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm font-medium select-none group-active:text-accent-foreground',\n        value === itemValue && 'text-accent-foreground'\n      )}>\n      <MenubarPrimitive.Trigger\n        className={cn(\n          'group flex items-center rounded-md px-2 py-1.5 sm:py-1',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none',\n          }),\n          value === itemValue && 'bg-accent',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction MenubarSubTrigger({\n  className,\n  inset,\n  children,\n  iconClassName,\n  ...props\n}: MenubarPrimitive.SubTriggerProps &\n  React.RefAttributes<MenubarPrimitive.SubTriggerRef> & {\n    children?: React.ReactNode;\n    iconClassName?: string;\n    inset?: boolean;\n  }) {\n  const { open } = MenubarPrimitive.useSubContext();\n  const icon = Platform.OS === 'web' ? ChevronRight : open ? ChevronUp : ChevronDown;\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm select-none group-active:text-accent-foreground',\n        open && 'text-accent-foreground'\n      )}>\n      <MenubarPrimitive.SubTrigger\n        className={cn(\n          'active:bg-accent group flex flex-row items-center justify-between rounded-sm px-2 py-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none [&_svg]:pointer-events-none',\n          }),\n          className,\n          open && 'bg-accent',\n          inset && 'pl-8'\n        )}\n        {...props}>\n        <>{children}</>\n        <Icon as={icon} className={cn('text-foreground size-4 shrink-0', iconClassName)} />\n      </MenubarPrimitive.SubTrigger>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction MenubarSubContent({\n  className,\n  ...props\n}: MenubarPrimitive.SubContentProps & React.RefAttributes<MenubarPrimitive.SubContentRef>) {\n  return (\n    <NativeOnlyAnimatedView entering={FadeIn}>\n      <MenubarPrimitive.SubContent\n        className={cn(\n          'bg-popover border-border overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\n          Platform.select({\n            web: 'animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 fade-in-0 data-[state=closed]:zoom-out-95 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 origin-(--radix-context-menu-content-transform-origin) z-50 min-w-[8rem]',\n          }),\n          className\n        )}\n        {...props}\n      />\n    </NativeOnlyAnimatedView>\n  );\n}\n\nfunction MenubarContent({\n  className,\n  overlayClassName,\n  overlayStyle,\n  portalHost,\n  align = 'start',\n  alignOffset = -4,\n  sideOffset = 8,\n  ...props\n}: MenubarPrimitive.ContentProps &\n  React.RefAttributes<MenubarPrimitive.ContentRef> & {\n    overlayStyle?: StyleProp<ViewStyle>;\n    overlayClassName?: string;\n    portalHost?: string;\n  }) {\n  return (\n    <MenubarPrimitive.Portal hostName={portalHost}>\n      <FullWindowOverlay>\n        <NativeOnlyAnimatedView\n          entering={FadeIn}\n          style={StyleSheet.absoluteFill}\n          pointerEvents=\"box-none\">\n          <TextClassContext.Provider value=\"text-popover-foreground\">\n            <MenubarPrimitive.Content\n              className={cn(\n                'bg-popover border-border min-w-[12rem] overflow-hidden rounded-md border p-1 shadow-lg shadow-black/5',\n                Platform.select({\n                  web: cn(\n                    'animate-in fade-in-0 zoom-in-95 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) z-50 cursor-default',\n                    props.side === 'bottom' && 'slide-in-from-top-2',\n                    props.side === 'top' && 'slide-in-from-bottom-2'\n                  ),\n                }),\n                className\n              )}\n              align={align}\n              alignOffset={alignOffset}\n              sideOffset={sideOffset}\n              {...props}\n            />\n          </TextClassContext.Provider>\n        </NativeOnlyAnimatedView>\n      </FullWindowOverlay>\n    </MenubarPrimitive.Portal>\n  );\n}\n\nfunction MenubarItem({\n  className,\n  inset,\n  variant,\n  ...props\n}: MenubarPrimitive.ItemProps &\n  React.RefAttributes<MenubarPrimitive.ItemRef> & {\n    className?: string;\n    inset?: boolean;\n    variant?: 'default' | 'destructive';\n  }) {\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'select-none text-sm text-popover-foreground group-active:text-popover-foreground',\n        variant === 'destructive' && 'text-destructive group-active:text-destructive'\n      )}>\n      <MenubarPrimitive.Item\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm px-2 py-2 sm:py-1.5',\n          Platform.select({\n            web: cn(\n              'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n              variant === 'destructive' && 'focus:bg-destructive/10 dark:focus:bg-destructive/20'\n            ),\n          }),\n          variant === 'destructive' && 'active:bg-destructive/10 dark:active:bg-destructive/20',\n          props.disabled && 'opacity-50',\n          inset && 'pl-8',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction MenubarCheckboxItem({\n  className,\n  children,\n  ...props\n}: MenubarPrimitive.CheckboxItemProps &\n  React.RefAttributes<MenubarPrimitive.CheckboxItemRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <TextClassContext.Provider value=\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\">\n      <MenubarPrimitive.CheckboxItem\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n          }),\n          props.disabled && 'opacity-50',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n          <MenubarPrimitive.ItemIndicator>\n            <Icon\n              as={Check}\n              className={cn(\n                'text-foreground size-4',\n                Platform.select({ web: 'pointer-events-none' })\n              )}\n            />\n          </MenubarPrimitive.ItemIndicator>\n        </View>\n        <>{children}</>\n      </MenubarPrimitive.CheckboxItem>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction MenubarRadioItem({\n  className,\n  children,\n  ...props\n}: MenubarPrimitive.RadioItemProps &\n  React.RefAttributes<MenubarPrimitive.RadioItemRef> & {\n    children?: React.ReactNode;\n  }) {\n  return (\n    <TextClassContext.Provider value=\"text-sm text-popover-foreground select-none group-active:text-accent-foreground\">\n      <MenubarPrimitive.RadioItem\n        className={cn(\n          'active:bg-accent group relative flex flex-row items-center gap-2 rounded-sm py-2 pl-8 pr-2 sm:py-1.5',\n          Platform.select({\n            web: 'focus:bg-accent focus:text-accent-foreground cursor-default outline-none data-[disabled]:pointer-events-none',\n          }),\n          props.disabled && 'opacity-50',\n          className\n        )}\n        {...props}>\n        <View className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n          <MenubarPrimitive.ItemIndicator>\n            <View className=\"bg-foreground h-2 w-2 rounded-full\" />\n          </MenubarPrimitive.ItemIndicator>\n        </View>\n        <>{children}</>\n      </MenubarPrimitive.RadioItem>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction MenubarLabel({\n  className,\n  inset,\n  ...props\n}: MenubarPrimitive.LabelProps &\n  React.RefAttributes<MenubarPrimitive.LabelRef> & {\n    className?: string;\n    inset?: boolean;\n  }) {\n  return (\n    <MenubarPrimitive.Label\n      className={cn(\n        'text-foreground px-2 py-2 text-sm font-medium sm:py-1.5',\n        inset && 'pl-8',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction MenubarSeparator({\n  className,\n  ...props\n}: MenubarPrimitive.SeparatorProps & React.RefAttributes<MenubarPrimitive.SeparatorRef>) {\n  return (\n    <MenubarPrimitive.Separator className={cn('bg-border -mx-1 my-1 h-px', className)} {...props} />\n  );\n}\n\nfunction MenubarShortcut({ className, ...props }: TextProps & React.RefAttributes<Text>) {\n  return (\n    <Text\n      className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\n      {...props}\n    />\n  );\n}\n\nexport {\n  Menubar,\n  MenubarCheckboxItem,\n  MenubarContent,\n  MenubarGroup,\n  MenubarItem,\n  MenubarLabel,\n  MenubarMenu,\n  MenubarPortal,\n  MenubarRadioGroup,\n  MenubarRadioItem,\n  MenubarSeparator,\n  MenubarShortcut,\n  MenubarSub,\n  MenubarSubContent,\n  MenubarSubTrigger,\n  MenubarTrigger,\n};\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/native-only-animated-view.tsx",
    "content": "import { Platform } from 'react-native';\nimport Animated from 'react-native-reanimated';\n\n/**\n * This component is used to wrap animated views that should only be animated on native.\n * @param props - The props for the animated view.\n * @returns The animated view if the platform is native, otherwise the children.\n * @example\n * <NativeOnlyAnimatedView entering={FadeIn} exiting={FadeOut}>\n *   <Text>I am only animated on native</Text>\n * </NativeOnlyAnimatedView>\n */\nfunction NativeOnlyAnimatedView(\n  props: React.ComponentProps<typeof Animated.View> & React.RefAttributes<Animated.View>\n) {\n  if (Platform.OS === 'web') {\n    return <>{props.children as React.ReactNode}</>;\n  } else {\n    return <Animated.View {...props} />;\n  }\n}\n\nexport { NativeOnlyAnimatedView };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/popover.tsx",
    "content": "import { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as PopoverPrimitive from '@rn-primitives/popover';\nimport * as React from 'react';\nimport { Platform, StyleSheet } from 'react-native';\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction PopoverContent({\n  className,\n  align = 'center',\n  sideOffset = 4,\n  portalHost,\n  ...props\n}: PopoverPrimitive.ContentProps &\n  React.RefAttributes<PopoverPrimitive.ContentRef> & {\n    portalHost?: string;\n  }) {\n  return (\n    <PopoverPrimitive.Portal hostName={portalHost}>\n      <FullWindowOverlay>\n        <PopoverPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\n          <NativeOnlyAnimatedView entering={FadeIn.duration(200)} exiting={FadeOut}>\n            <TextClassContext.Provider value=\"text-popover-foreground\">\n              <PopoverPrimitive.Content\n                align={align}\n                sideOffset={sideOffset}\n                className={cn(\n                  'bg-popover border-border outline-hidden z-50 w-72 rounded-md border p-4 shadow-md shadow-black/5',\n                  Platform.select({\n                    web: cn(\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-popover-content-transform-origin) cursor-auto',\n                      props.side === 'bottom' && 'slide-in-from-top-2',\n                      props.side === 'top' && 'slide-in-from-bottom-2'\n                    ),\n                  }),\n                  className\n                )}\n                {...props}\n              />\n            </TextClassContext.Provider>\n          </NativeOnlyAnimatedView>\n        </PopoverPrimitive.Overlay>\n      </FullWindowOverlay>\n    </PopoverPrimitive.Portal>\n  );\n}\n\nexport { Popover, PopoverContent, PopoverTrigger };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/progress.tsx",
    "content": "import { cn } from '@/registry/uniwind/lib/utils';\nimport * as ProgressPrimitive from '@rn-primitives/progress';\nimport { Platform, View } from 'react-native';\nimport Animated, {\n  Extrapolation,\n  interpolate,\n  useAnimatedStyle,\n  useDerivedValue,\n  withSpring,\n} from 'react-native-reanimated';\n\nfunction Progress({\n  className,\n  value,\n  indicatorClassName,\n  ...props\n}: ProgressPrimitive.RootProps &\n  React.RefAttributes<ProgressPrimitive.RootRef> & {\n    indicatorClassName?: string;\n  }) {\n  return (\n    <ProgressPrimitive.Root\n      className={cn('bg-primary/20 relative h-2 w-full overflow-hidden rounded-full', className)}\n      {...props}>\n      <Indicator value={value} className={indicatorClassName} />\n    </ProgressPrimitive.Root>\n  );\n}\n\nexport { Progress };\n\nconst Indicator = Platform.select({\n  web: WebIndicator,\n  native: NativeIndicator,\n  default: NullIndicator,\n});\n\ntype IndicatorProps = {\n  value: number | undefined | null;\n  className?: string;\n};\n\nfunction WebIndicator({ value, className }: IndicatorProps) {\n  if (Platform.OS !== 'web') {\n    return null;\n  }\n\n  return (\n    <View\n      className={cn('bg-primary h-full w-full flex-1 transition-all', className)}\n      style={{ transform: `translateX(-${100 - (value ?? 0)}%)` }}>\n      <ProgressPrimitive.Indicator className={cn('h-full w-full', className)} />\n    </View>\n  );\n}\n\nfunction NativeIndicator({ value, className }: IndicatorProps) {\n  const progress = useDerivedValue(() => value ?? 0);\n\n  const indicator = useAnimatedStyle(() => {\n    return {\n      width: withSpring(\n        `${interpolate(progress.value, [0, 100], [1, 100], Extrapolation.CLAMP)}%`,\n        { overshootClamping: true }\n      ),\n    };\n  }, [value]);\n\n  if (Platform.OS === 'web') {\n    return null;\n  }\n\n  return (\n    <ProgressPrimitive.Indicator asChild>\n      <Animated.View style={indicator} className={cn('bg-foreground h-full', className)} />\n    </ProgressPrimitive.Indicator>\n  );\n}\n\nfunction NullIndicator(_props: IndicatorProps) {\n  return null;\n}\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/radio-group.tsx",
    "content": "import { cn } from '@/registry/uniwind/lib/utils';\nimport * as RadioGroupPrimitive from '@rn-primitives/radio-group';\nimport { Platform } from 'react-native';\n\nfunction RadioGroup({\n  className,\n  ...props\n}: RadioGroupPrimitive.RootProps & React.RefAttributes<RadioGroupPrimitive.RootRef>) {\n  return <RadioGroupPrimitive.Root className={cn('gap-3', className)} {...props} />;\n}\n\nfunction RadioGroupItem({\n  className,\n  ...props\n}: RadioGroupPrimitive.ItemProps & React.RefAttributes<RadioGroupPrimitive.ItemRef>) {\n  return (\n    <RadioGroupPrimitive.Item\n      className={cn(\n        'border-input dark:bg-input/30 aspect-square size-4 shrink-0 items-center justify-center rounded-full border shadow-sm shadow-black/5',\n        Platform.select({\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive outline-none transition-all focus-visible:ring-[3px] disabled:cursor-not-allowed',\n        }),\n        props.disabled && 'opacity-50',\n        className\n      )}\n      {...props}>\n      <RadioGroupPrimitive.Indicator className=\"bg-primary size-2 rounded-full\" />\n    </RadioGroupPrimitive.Item>\n  );\n}\n\nexport { RadioGroup, RadioGroupItem };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/select.tsx",
    "content": "import { Icon } from '@/registry/uniwind/components/ui/icon';\nimport { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as SelectPrimitive from '@rn-primitives/select';\nimport { Check, ChevronDown, ChevronDownIcon, ChevronUpIcon } from 'lucide-react-native';\nimport * as React from 'react';\nimport { Platform, ScrollView, StyleSheet, View } from 'react-native';\nimport { FadeIn, FadeOut } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\ntype Option = SelectPrimitive.Option;\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nfunction SelectValue({\n  ref,\n  className,\n  ...props\n}: SelectPrimitive.ValueProps &\n  React.RefAttributes<SelectPrimitive.ValueRef> & {\n    className?: string;\n  }) {\n  const { value } = SelectPrimitive.useRootContext();\n  return (\n    <SelectPrimitive.Value\n      ref={ref}\n      className={cn(\n        'text-foreground line-clamp-1 flex flex-row items-center gap-2 text-sm',\n        !value && 'text-muted-foreground',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction SelectTrigger({\n  ref,\n  className,\n  children,\n  size = 'default',\n  ...props\n}: SelectPrimitive.TriggerProps &\n  React.RefAttributes<SelectPrimitive.TriggerRef> & {\n    children?: React.ReactNode;\n    size?: 'default' | 'sm';\n  }) {\n  return (\n    <SelectPrimitive.Trigger\n      ref={ref}\n      className={cn(\n        'border-input dark:bg-input/30 dark:active:bg-input/50 bg-background flex h-10 flex-row items-center justify-between gap-2 rounded-md border px-3 py-2 shadow-sm shadow-black/5 sm:h-9',\n        Platform.select({\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:hover:bg-input/50 w-fit whitespace-nowrap text-sm outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:shrink-0',\n        }),\n        props.disabled && 'opacity-50',\n        size === 'sm' && 'h-8 py-2 sm:py-1.5',\n        className\n      )}\n      {...props}>\n      <>{children}</>\n      <Icon as={ChevronDown} aria-hidden={true} className=\"text-muted-foreground size-4\" />\n    </SelectPrimitive.Trigger>\n  );\n}\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction SelectContent({\n  className,\n  children,\n  position = 'popper',\n  portalHost,\n  ...props\n}: SelectPrimitive.ContentProps &\n  React.RefAttributes<SelectPrimitive.ContentRef> & {\n    className?: string;\n    portalHost?: string;\n  }) {\n  return (\n    <SelectPrimitive.Portal hostName={portalHost}>\n      <FullWindowOverlay>\n        <SelectPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\n          <TextClassContext.Provider value=\"text-popover-foreground\">\n            <NativeOnlyAnimatedView className=\"z-50\" entering={FadeIn} exiting={FadeOut}>\n              <SelectPrimitive.Content\n                className={cn(\n                  'bg-popover border-border relative z-50 min-w-[8rem] rounded-md border shadow-md shadow-black/5',\n                  Platform.select({\n                    web: cn(\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-select-content-transform-origin) max-h-52 overflow-y-auto overflow-x-hidden',\n                      props.side === 'bottom' && 'slide-in-from-top-2',\n                      props.side === 'top' && 'slide-in-from-bottom-2'\n                    ),\n                    native: 'p-1',\n                  }),\n                  position === 'popper' &&\n                  Platform.select({\n                    web: cn(\n                      props.side === 'bottom' && 'translate-y-1',\n                      props.side === 'top' && '-translate-y-1'\n                    ),\n                  }),\n                  className\n                )}\n                position={position}\n                {...props}>\n                <SelectScrollUpButton />\n                <SelectPrimitive.Viewport\n                  className={cn(\n                    'p-1',\n                    position === 'popper' &&\n                    cn(\n                      'w-full',\n                      Platform.select({\n                        web: 'h-[var(--radix-select-trigger-height)] min-w-[var(--radix-select-trigger-width)]',\n                      })\n                    )\n                  )}>\n                  {children}\n                </SelectPrimitive.Viewport>\n                <SelectScrollDownButton />\n              </SelectPrimitive.Content>\n            </NativeOnlyAnimatedView>\n          </TextClassContext.Provider>\n        </SelectPrimitive.Overlay>\n      </FullWindowOverlay>\n    </SelectPrimitive.Portal>\n  );\n}\n\nfunction SelectLabel({\n  className,\n  ...props\n}: SelectPrimitive.LabelProps & React.RefAttributes<SelectPrimitive.LabelRef>) {\n  return (\n    <SelectPrimitive.Label\n      className={cn('text-muted-foreground px-2 py-2 text-xs sm:py-1.5', className)}\n      {...props}\n    />\n  );\n}\n\nfunction SelectItem({\n  className,\n  ...props\n}: Omit<SelectPrimitive.ItemProps, \"children\"> & React.RefAttributes<SelectPrimitive.ItemRef>) {\n  return (\n    <SelectPrimitive.Item\n      className={cn(\n        'active:bg-accent group relative flex w-full flex-row items-center gap-2 rounded-sm py-2 pl-2 pr-8 sm:py-1.5',\n        Platform.select({\n          web: 'focus:bg-accent focus:text-accent-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 cursor-default outline-none data-[disabled]:pointer-events-none [&_svg]:pointer-events-none',\n        }),\n        props.disabled && 'opacity-50',\n        className\n      )}\n      {...props}>\n      <View className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n        <SelectPrimitive.ItemIndicator>\n          <Icon as={Check} className=\"text-muted-foreground size-4 shrink-0\" />\n        </SelectPrimitive.ItemIndicator>\n      </View>\n      <SelectPrimitive.ItemText className=\"text-foreground group-active:text-accent-foreground select-none text-sm\" />\n    </SelectPrimitive.Item>\n  );\n}\n\nfunction SelectSeparator({\n  className,\n  ...props\n}: SelectPrimitive.SeparatorProps & React.RefAttributes<SelectPrimitive.SeparatorRef>) {\n  return (\n    <SelectPrimitive.Separator\n      className={cn(\n        'bg-border -mx-1 my-1 h-px',\n        Platform.select({ web: 'pointer-events-none' }),\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\n/**\n * @platform Web only\n * Returns null on native platforms\n */\nfunction SelectScrollUpButton({\n  className,\n  ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n  if (Platform.OS !== 'web') {\n    return null;\n  }\n  return (\n    <SelectPrimitive.ScrollUpButton\n      className={cn('flex cursor-default items-center justify-center py-1', className)}\n      {...props}>\n      <Icon as={ChevronUpIcon} className=\"size-4\" />\n    </SelectPrimitive.ScrollUpButton>\n  );\n}\n\n/**\n * @platform Web only\n * Returns null on native platforms\n */\nfunction SelectScrollDownButton({\n  className,\n  ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n  if (Platform.OS !== 'web') {\n    return null;\n  }\n  return (\n    <SelectPrimitive.ScrollDownButton\n      className={cn('flex cursor-default items-center justify-center py-1', className)}\n      {...props}>\n      <Icon as={ChevronDownIcon} className=\"size-4\" />\n    </SelectPrimitive.ScrollDownButton>\n  );\n}\n\n\nexport {\n  Select,\n  SelectContent,\n  SelectGroup,\n  SelectItem,\n  SelectLabel,\n  SelectScrollDownButton,\n  SelectScrollUpButton,\n  SelectSeparator,\n  SelectTrigger,\n  SelectValue,\n  type Option,\n};\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/separator.tsx",
    "content": "import { cn } from '@/registry/uniwind/lib/utils';\nimport * as SeparatorPrimitive from '@rn-primitives/separator';\n\nfunction Separator({\n  className,\n  orientation = 'horizontal',\n  decorative = true,\n  ...props\n}: SeparatorPrimitive.RootProps & React.RefAttributes<SeparatorPrimitive.RootRef>) {\n  return (\n    <SeparatorPrimitive.Root\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}\n\nexport { Separator };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/skeleton.tsx",
    "content": "import { cn } from '@/registry/uniwind/lib/utils';\nimport { View } from 'react-native';\nimport Animated, {\n  useAnimatedStyle,\n  useSharedValue,\n  withRepeat,\n  withTiming,\n} from 'react-native-reanimated';\nimport * as React from 'react';\n\nconst duration = 1000;\n\nfunction Skeleton({\n  className,\n  ...props\n}: React.ComponentProps<typeof View> & React.RefAttributes<View>) {\n  const sv = useSharedValue(1);\n\n  React.useEffect(() => {\n    sv.value = withRepeat(withTiming(0.5, { duration }), -1, true);\n  }, []);\n\n  const style = useAnimatedStyle(\n    () => ({\n      opacity: sv.value,\n    }),\n    [sv]\n  );\n  return (\n    <Animated.View\n      style={style}\n      className={cn('bg-secondary dark:bg-muted rounded-md', className)}\n      {...props}\n    />\n  );\n}\n\nexport { Skeleton };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/switch.tsx",
    "content": "import { cn } from '@/registry/uniwind/lib/utils';\nimport * as SwitchPrimitives from '@rn-primitives/switch';\nimport { Platform } from 'react-native';\n\nfunction Switch({\n  className,\n  ...props\n}: SwitchPrimitives.RootProps & React.RefAttributes<SwitchPrimitives.RootRef>) {\n  return (\n    <SwitchPrimitives.Root\n      className={cn(\n        'flex h-[1.15rem] w-8 shrink-0 flex-row items-center rounded-full border border-transparent shadow-sm shadow-black/5',\n        Platform.select({\n          web: 'focus-visible:border-ring focus-visible:ring-ring/50 peer inline-flex outline-none transition-all focus-visible:ring-[3px] disabled:cursor-not-allowed',\n        }),\n        props.checked ? 'bg-primary' : 'bg-input dark:bg-input/80',\n        props.disabled && 'opacity-50',\n        className\n      )}\n      {...props}>\n      <SwitchPrimitives.Thumb\n        className={cn(\n          'bg-background size-4 rounded-full transition-transform',\n          Platform.select({\n            web: 'pointer-events-none block ring-0',\n          }),\n          props.checked\n            ? 'dark:bg-primary-foreground translate-x-3.5'\n            : 'dark:bg-foreground translate-x-0'\n        )}\n      />\n    </SwitchPrimitives.Root>\n  );\n}\n\nexport { Switch };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/tabs.tsx",
    "content": "import { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as TabsPrimitive from '@rn-primitives/tabs';\nimport { Platform } from 'react-native';\n\nfunction Tabs({\n  className,\n  ...props\n}: TabsPrimitive.RootProps & React.RefAttributes<TabsPrimitive.RootRef>) {\n  return <TabsPrimitive.Root className={cn('flex flex-col gap-2', className)} {...props} />;\n}\n\nfunction TabsList({\n  className,\n  ...props\n}: TabsPrimitive.ListProps & React.RefAttributes<TabsPrimitive.ListRef>) {\n  return (\n    <TabsPrimitive.List\n      className={cn(\n        'bg-muted flex h-9 flex-row items-center justify-center rounded-lg p-[3px]',\n        Platform.select({ web: 'inline-flex w-fit', native: 'mr-auto' }),\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction TabsTrigger({\n  className,\n  ...props\n}: TabsPrimitive.TriggerProps & React.RefAttributes<TabsPrimitive.TriggerRef>) {\n  const { value } = TabsPrimitive.useRootContext();\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-foreground dark:text-muted-foreground text-sm font-medium',\n        value === props.value && 'dark:text-foreground'\n      )}>\n      <TabsPrimitive.Trigger\n        className={cn(\n          'flex flex-row items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 shadow-none shadow-black/5',\n          Platform.select({\n            web: 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring web:h-[calc(100%-1px)] inline-flex cursor-default whitespace-nowrap transition-[color,box-shadow] focus-visible:outline-1 focus-visible:ring-[3px] disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0',\n          }),\n          props.disabled && 'opacity-50',\n          props.value === value && 'bg-background dark:border-foreground/10 dark:bg-input/30',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction TabsContent({\n  className,\n  ...props\n}: TabsPrimitive.ContentProps & React.RefAttributes<TabsPrimitive.ContentRef>) {\n  return (\n    <TabsPrimitive.Content\n      className={cn(Platform.select({ web: 'flex-1 outline-none' }), className)}\n      {...props}\n    />\n  );\n}\n\nexport { Tabs, TabsContent, TabsList, TabsTrigger };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/text.tsx",
    "content": "import { cn } from '@/registry/uniwind/lib/utils';\nimport * as Slot from '@rn-primitives/slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport { Platform, Text as RNText, type Role } from 'react-native';\n\nconst textVariants = cva(\n  cn(\n    'text-foreground text-base',\n    Platform.select({\n      web: 'select-text',\n    })\n  ),\n  {\n    variants: {\n      variant: {\n        default: '',\n        h1: cn(\n          'text-center text-4xl font-extrabold tracking-tight',\n          Platform.select({ web: 'scroll-m-20 text-balance' })\n        ),\n        h2: cn(\n          'border-border border-b pb-2 text-3xl font-semibold tracking-tight',\n          Platform.select({ web: 'scroll-m-20 first:mt-0' })\n        ),\n        h3: cn('text-2xl font-semibold tracking-tight', Platform.select({ web: 'scroll-m-20' })),\n        h4: cn('text-xl font-semibold tracking-tight', Platform.select({ web: 'scroll-m-20' })),\n        p: 'mt-3 leading-7 sm:mt-6',\n        blockquote: 'mt-4 border-l-2 pl-3 italic sm:mt-6 sm:pl-6',\n        code: cn(\n          'bg-muted relative rounded px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold'\n        ),\n        lead: 'text-muted-foreground text-xl',\n        large: 'text-lg font-semibold',\n        small: 'text-sm font-medium leading-none',\n        muted: 'text-muted-foreground text-sm',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n    },\n  }\n);\n\ntype TextVariantProps = VariantProps<typeof textVariants>;\n\ntype TextVariant = NonNullable<TextVariantProps['variant']>;\n\nconst ROLE: Partial<Record<TextVariant, Role>> = {\n  h1: 'heading',\n  h2: 'heading',\n  h3: 'heading',\n  h4: 'heading',\n  blockquote: Platform.select({ web: 'blockquote' as Role }),\n  code: Platform.select({ web: 'code' as Role }),\n};\n\nconst ARIA_LEVEL: Partial<Record<TextVariant, string>> = {\n  h1: '1',\n  h2: '2',\n  h3: '3',\n  h4: '4',\n};\n\nconst TextClassContext = React.createContext<string | undefined>(undefined);\n\nfunction Text({\n  className,\n  asChild = false,\n  variant = 'default',\n  ...props\n}: React.ComponentProps<typeof RNText> &\n  TextVariantProps &\n  React.RefAttributes<RNText> & {\n    asChild?: boolean;\n  }) {\n  const textClass = React.useContext(TextClassContext);\n  const Component = asChild ? Slot.Text : RNText;\n  return (\n    <Component\n      className={cn(textVariants({ variant }), textClass, className)}\n      role={variant ? ROLE[variant] : undefined}\n      aria-level={variant ? ARIA_LEVEL[variant] : undefined}\n      {...props}\n    />\n  );\n}\n\nexport { Text, TextClassContext };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/textarea.tsx",
    "content": "import { cn } from '@/registry/uniwind/lib/utils';\nimport { Platform, TextInput, type TextInputProps } from 'react-native';\n\nfunction Textarea({\n  className,\n  multiline = true,\n  numberOfLines = Platform.select({ web: 2, native: 8 }), // On web, numberOfLines also determines initial height. On native, it determines the maximum height.\n  placeholderClassName,\n  ...props\n}: TextInputProps & React.RefAttributes<TextInput>) {\n  return (\n    <TextInput\n      className={cn(\n        'text-foreground border-input dark:bg-input/30 flex min-h-16 w-full flex-row rounded-md border bg-transparent px-3 py-2 text-base shadow-sm shadow-black/5 md:text-sm',\n        Platform.select({\n          web: 'placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive field-sizing-content resize-y outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed',\n        }),\n        props.editable === false && 'opacity-50',\n        className\n      )}\n      placeholderClassName={cn('text-muted-foreground', placeholderClassName)}\n      multiline={multiline}\n      numberOfLines={numberOfLines}\n      textAlignVertical=\"top\"\n      {...props}\n    />\n  );\n}\n\nexport { Textarea };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/toggle-group.tsx",
    "content": "import { Icon } from '@/registry/uniwind/components/ui/icon';\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { toggleVariants } from '@/registry/uniwind/components/ui/toggle';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as ToggleGroupPrimitive from '@rn-primitives/toggle-group';\nimport type { VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport { Platform } from 'react-native';\n\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants> | null>(null);\n\nfunction ToggleGroup({\n  className,\n  variant,\n  size,\n  children,\n  ...props\n}: ToggleGroupPrimitive.RootProps &\n  VariantProps<typeof toggleVariants> &\n  React.RefAttributes<ToggleGroupPrimitive.RootRef>) {\n  return (\n    <ToggleGroupPrimitive.Root\n      className={cn(\n        'flex flex-row items-center rounded-md shadow-none',\n        Platform.select({ web: 'w-fit' }),\n        variant === 'outline' && 'shadow-sm shadow-black/5',\n        className\n      )}\n      {...props}>\n      <ToggleGroupContext.Provider value={{ variant, size }}>\n        {children}\n      </ToggleGroupContext.Provider>\n    </ToggleGroupPrimitive.Root>\n  );\n}\n\nfunction useToggleGroupContext() {\n  const context = React.useContext(ToggleGroupContext);\n  if (context === null) {\n    throw new Error(\n      'ToggleGroup compound components cannot be rendered outside the ToggleGroup component'\n    );\n  }\n  return context;\n}\n\nfunction ToggleGroupItem({\n  className,\n  children,\n  variant,\n  size,\n  isFirst,\n  isLast,\n  ...props\n}: ToggleGroupPrimitive.ItemProps &\n  VariantProps<typeof toggleVariants> &\n  React.RefAttributes<ToggleGroupPrimitive.ItemRef> & {\n    isFirst?: boolean;\n    isLast?: boolean;\n  }) {\n  const context = useToggleGroupContext();\n  const { value } = ToggleGroupPrimitive.useRootContext();\n\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm text-foreground font-medium',\n        ToggleGroupPrimitive.utils.getIsSelected(value, props.value)\n          ? 'text-accent-foreground'\n          : Platform.select({ web: 'group-hover:text-muted-foreground' })\n      )}>\n      <ToggleGroupPrimitive.Item\n        className={cn(\n          toggleVariants({\n            variant: context.variant || variant,\n            size: context.size || size,\n          }),\n          props.disabled && 'opacity-50',\n          ToggleGroupPrimitive.utils.getIsSelected(value, props.value) && 'bg-accent',\n          'min-w-0 shrink-0 rounded-none shadow-none',\n          isFirst && 'rounded-l-md',\n          isLast && 'rounded-r-md',\n          (context.variant === 'outline' || variant === 'outline') && 'border-l-0',\n          (context.variant === 'outline' || variant === 'outline') && isFirst && 'border-l',\n          Platform.select({\n            web: 'flex-1 focus:z-10 focus-visible:z-10',\n          }),\n          className\n        )}\n        {...props}>\n        {children}\n      </ToggleGroupPrimitive.Item>\n    </TextClassContext.Provider>\n  );\n}\n\nfunction ToggleGroupIcon({ className, ...props }: React.ComponentProps<typeof Icon>) {\n  const textClass = React.useContext(TextClassContext);\n  return <Icon className={cn('size-4 shrink-0', textClass, className)} {...props} />;\n}\n\nexport { ToggleGroup, ToggleGroupIcon, ToggleGroupItem };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/toggle.tsx",
    "content": "import { Icon } from '@/registry/uniwind/components/ui/icon';\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as TogglePrimitive from '@rn-primitives/toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport { Platform } from 'react-native';\n\nconst toggleVariants = cva(\n  cn(\n    'active:bg-muted group flex flex-row items-center justify-center gap-2 rounded-md',\n    Platform.select({\n      web: 'hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex cursor-default whitespace-nowrap outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:pointer-events-none [&_svg]:pointer-events-none',\n    })\n  ),\n  {\n    variants: {\n      variant: {\n        default: 'bg-transparent',\n        outline: cn(\n          'border-input active:bg-accent border bg-transparent shadow-sm shadow-black/5',\n          Platform.select({\n            web: 'hover:bg-accent hover:text-accent-foreground',\n          })\n        ),\n      },\n      size: {\n        default: 'h-10 min-w-10 px-2.5 sm:h-9 sm:min-w-9 sm:px-2',\n        sm: 'h-9 min-w-9 px-2 sm:h-8 sm:min-w-8 sm:px-1.5',\n        lg: 'h-11 min-w-11 px-3 sm:h-10 sm:min-w-10 sm:px-2.5',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  }\n);\n\nfunction Toggle({\n  className,\n  variant,\n  size,\n  ...props\n}: TogglePrimitive.RootProps &\n  VariantProps<typeof toggleVariants> &\n  React.RefAttributes<TogglePrimitive.RootRef>) {\n  return (\n    <TextClassContext.Provider\n      value={cn(\n        'text-sm text-foreground font-medium',\n        props.pressed\n          ? 'text-accent-foreground'\n          : Platform.select({ web: 'group-hover:text-muted-foreground' }),\n        className\n      )}>\n      <TogglePrimitive.Root\n        className={cn(\n          toggleVariants({ variant, size }),\n          props.disabled && 'opacity-50',\n          props.pressed && 'bg-accent',\n          className\n        )}\n        {...props}\n      />\n    </TextClassContext.Provider>\n  );\n}\n\nfunction ToggleIcon({ className, ...props }: React.ComponentProps<typeof Icon>) {\n  const textClass = React.useContext(TextClassContext);\n  return <Icon className={cn('size-4 shrink-0', textClass, className)} {...props} />;\n}\n\nexport { Toggle, ToggleIcon, toggleVariants };\n"
  },
  {
    "path": "packages/registry/src/uniwind/components/ui/tooltip.tsx",
    "content": "import { NativeOnlyAnimatedView } from '@/registry/uniwind/components/ui/native-only-animated-view';\nimport { TextClassContext } from '@/registry/uniwind/components/ui/text';\nimport { cn } from '@/registry/uniwind/lib/utils';\nimport * as TooltipPrimitive from '@rn-primitives/tooltip';\nimport * as React from 'react';\nimport { Platform, StyleSheet } from 'react-native';\nimport { FadeInDown, FadeInUp, FadeOut } from 'react-native-reanimated';\nimport { FullWindowOverlay as RNFullWindowOverlay } from 'react-native-screens';\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst FullWindowOverlay = Platform.OS === 'ios' ? RNFullWindowOverlay : React.Fragment;\n\nfunction TooltipContent({\n  className,\n  sideOffset = 4,\n  portalHost,\n  side = 'top',\n  ...props\n}: TooltipPrimitive.ContentProps &\n  React.RefAttributes<TooltipPrimitive.ContentRef> & {\n    portalHost?: string;\n  }) {\n  return (\n    <TooltipPrimitive.Portal hostName={portalHost}>\n      <FullWindowOverlay>\n        <TooltipPrimitive.Overlay style={Platform.select({ native: StyleSheet.absoluteFill })}>\n          <NativeOnlyAnimatedView\n            entering={\n              side === 'top'\n                ? FadeInDown.withInitialValues({ transform: [{ translateY: 3 }] }).duration(150)\n                : FadeInUp.withInitialValues({ transform: [{ translateY: -5 }] })\n            }\n            exiting={FadeOut}>\n            <TextClassContext.Provider value=\"text-xs text-primary-foreground\">\n              <TooltipPrimitive.Content\n                sideOffset={sideOffset}\n                className={cn(\n                  'bg-primary z-50 rounded-md px-3 py-2 sm:py-1.5',\n                  Platform.select({\n                    web: cn(\n                      'animate-in fade-in-0 zoom-in-95 origin-(--radix-tooltip-content-transform-origin) w-fit text-balance',\n                      side === 'bottom' && 'slide-in-from-top-2',\n                      side === 'left' && 'slide-in-from-right-2',\n                      side === 'right' && 'slide-in-from-left-2',\n                      side === 'top' && 'slide-in-from-bottom-2'\n                    ),\n                  }),\n                  className\n                )}\n                side={side}\n                {...props}\n              />\n            </TextClassContext.Provider>\n          </NativeOnlyAnimatedView>\n        </TooltipPrimitive.Overlay>\n      </FullWindowOverlay>\n    </TooltipPrimitive.Portal>\n  );\n}\n\nexport { Tooltip, TooltipContent, TooltipTrigger };\n"
  },
  {
    "path": "packages/registry/src/uniwind/lib/index.ts",
    "content": "export * from '@/registry/uniwind/lib/utils';\n"
  },
  {
    "path": "packages/registry/src/uniwind/lib/utils.ts",
    "content": "import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs));\n}\n"
  },
  {
    "path": "packages/registry/tsconfig.json",
    "content": "{\n  \"extends\": \"@tsconfig/recommended/tsconfig.json\",\n  \"include\": [\n    \"*.ts\",\n    \"src\",\n    \"nativewind-env.d.ts\"\n  ],\n  \"compilerOptions\": {\n    \"jsx\": \"react-jsx\",\n    \"baseUrl\": \".\",\n    \"paths\": {\n      \"@/registry/*\": [\n        \"src/*\"\n      ]\n    }\n  },\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}"
  },
  {
    "path": "packages/registry/uniwind-types.d.ts",
    "content": "// NOTE: This file is generated by uniwind and it should not be edited manually.\n/// <reference types=\"uniwind/types\" />\n\ndeclare module 'uniwind' {\n    export interface UniwindConfig {\n        themes: readonly ['light', 'dark']\n    }\n}\n\nexport {}\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n  - apps/*\n  - packages/**/*\n"
  },
  {
    "path": "turbo.json",
    "content": "{\n  \"$schema\": \"https://turborepo.org/schema.json\",\n  \"pipeline\": {\n    \"lint\": {\n      \"outputs\": []\n    },\n    \"test\": {\n      \"dependsOn\": [\"build\"],\n      \"inputs\": [\"**/*.{ts,tsx,js,jsx}\"]\n    },\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist/**\", \"build/**\", \"node_modules/.cache/metro/**\"]\n    },\n    \"dev\": {\n      \"cache\": false,\n      \"persistent\": true\n    },\n    \"dev:android\": {\n      \"cache\": false,\n      \"persistent\": true\n    },\n    \"dev:web\": {\n      \"cache\": false,\n      \"persistent\": true\n    },\n    \"clean\": {\n      \"cache\": false\n    }\n  }\n}\n"
  }
]