{"_id":"@captaincompliance/cc-mobile-app","_rev":"3-e8f37c1139a42c7074cf7b2354554327","name":"@captaincompliance/cc-mobile-app","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@captaincompliance/cc-mobile-app","version":"1.0.0","keywords":["react-native","npm-package","compliance","mobile","captaincompliance"],"author":{"name":"Captain Compliance","email":"tu-email@empresa.com"},"license":"MIT","_id":"@captaincompliance/cc-mobile-app@1.0.0","maintainers":[{"name":"acnicolasdc","email":"nicolasreyesbejarano@gmail.com"},{"name":"malkady","email":"malkady@gmail.com"},{"name":"alvaropazos","email":"alvaropazos1997@gmail.com"}],"homepage":"https://github.com/Captain-Compliance/cc-mobile-app#readme","bugs":{"url":"https://github.com/Captain-Compliance/cc-mobile-app/issues"},"dist":{"shasum":"8a209013f151bb6088248644e6387dfd83488c8d","tarball":"https://registry.npmjs.org/@captaincompliance/cc-mobile-app/-/cc-mobile-app-1.0.0.tgz","fileCount":57,"integrity":"sha512-1J76BEB8p6JVhdF3nVmCuWzs7Pv1K6XZdGsQ3brYAvF8oirQmuusl+nBN0j0Gq03fChK0cuS3e1xvzldd9BdWA==","signatures":[{"sig":"MEUCIQCop2YIZJmaj8OsyaTZX3Ud+mw15LDcndkcZEQLqR6nBgIgaigo2vaV5wBsMd+a6I62bdeMvmdlG7Ntr9wUFK2IGSM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80485},"main":"./lib/module/index.js","types":"./lib/typescript/index.d.ts","module":"lib/module/index.js","exports":{".":{"types":"./lib/typescript/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"2f9daae07d03b54f5649b2443ba42fa753680766","scripts":{"lint":"eslint . --ext .ts,.tsx","test":"jest","build":"bob build","prepare":"bob build"},"_npmUser":{"name":"acnicolasdc","email":"nicolasreyesbejarano@gmail.com"},"repository":{"url":"git+https://github.com/Captain-Compliance/cc-mobile-app.git","type":"git"},"_npmVersion":"10.9.3","description":"Paquete React Native para Captain Compliance","directories":{},"_nodeVersion":"22.19.0","dependencies":{"@react-native-async-storage/async-storage":"^2.2.0"},"eslintIgnore":["node_modules/","lib/"],"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.7.0","typescript":"^5.5.4","@types/jest":"^29.5.12","@types/react":"^19.0.2","react-native-svg":"^15.13.0","react-native-builder-bob":"^0.40.13","@react-native/eslint-config":"^0.76.0","@testing-library/react-native":"^13.0.0"},"peerDependencies":{"react":">=18.0.0","react-native":">=0.76.0","react-native-svg":">=13.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cc-mobile-app_1.0.0_1758665781552_0.3827311072267152","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],"typescript"]}},"1.0.1":{"name":"@captaincompliance/cc-mobile-app","version":"1.0.1","keywords":["react-native","npm-package","compliance","mobile","captaincompliance"],"author":{"name":"Captain Compliance","email":"tu-email@empresa.com"},"license":"MIT","_id":"@captaincompliance/cc-mobile-app@1.0.1","maintainers":[{"name":"acnicolasdc","email":"nicolasreyesbejarano@gmail.com"},{"name":"malkady","email":"malkady@gmail.com"},{"name":"alvaropazos","email":"alvaropazos1997@gmail.com"}],"homepage":"https://github.com/Captain-Compliance/cc-mobile-app#readme","bugs":{"url":"https://github.com/Captain-Compliance/cc-mobile-app/issues"},"dist":{"shasum":"aab7d8462850c8673d563dc7b65e48587a187059","tarball":"https://registry.npmjs.org/@captaincompliance/cc-mobile-app/-/cc-mobile-app-1.0.1.tgz","fileCount":57,"integrity":"sha512-PslYvflznxK8s1l1DPtBrN7WFilzTXKYbEuOXQRuQ4+xhfYanhOO/9e0lVvbCumhcFjyN1MlAUFB8CscxZlHiw==","signatures":[{"sig":"MEUCIDtLUtB2Swouwhg6KSIR8pSZmKOOCRmbMcrv31Qtd42vAiEA3nIgFHJ6VCDtN9ygZXI9ZEtPUt05PrMBcWC67QEBKuM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82007},"main":"./lib/module/index.js","types":"./lib/typescript/index.d.ts","module":"lib/module/index.js","exports":{".":{"types":"./lib/typescript/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"e896865acfe72f3f29ec2de4c66784c9c7cb8f19","scripts":{"lint":"eslint . --ext .ts,.tsx","test":"jest","build":"bob build","prepare":"bob build"},"_npmUser":{"name":"acnicolasdc","email":"nicolasreyesbejarano@gmail.com"},"repository":{"url":"git+https://github.com/Captain-Compliance/cc-mobile-app.git","type":"git"},"_npmVersion":"10.9.3","description":"Paquete React Native para Captain Compliance","directories":{},"_nodeVersion":"22.19.0","dependencies":{"@react-native-async-storage/async-storage":"^2.2.0"},"eslintIgnore":["node_modules/","lib/"],"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.7.0","typescript":"^5.5.4","@types/jest":"^29.5.12","@types/react":"^19.0.2","react-native-svg":"^15.13.0","react-native-builder-bob":"^0.40.13","@react-native/eslint-config":"^0.76.0","@testing-library/react-native":"^13.0.0"},"peerDependencies":{"react":">=18.0.0","react-native":">=0.76.0","react-native-svg":">=13.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cc-mobile-app_1.0.1_1758670019575_0.12836631233542528","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],"typescript"]}},"1.0.2":{"name":"@captaincompliance/cc-mobile-app","version":"1.0.2","description":"Paquete React Native para Captain Compliance","main":"./lib/module/index.js","module":"lib/module/index.js","types":"./lib/typescript/index.d.ts","scripts":{"build":"bob build","lint":"eslint . --ext .ts,.tsx","test":"jest","prepare":"bob build"},"keywords":["react-native","npm-package","compliance","mobile","captaincompliance"],"repository":{"type":"git","url":"git+https://github.com/Captain-Compliance/cc-mobile-app.git"},"author":{"name":"Captain Compliance","email":"tu-email@empresa.com"},"license":"MIT","bugs":{"url":"https://github.com/Captain-Compliance/cc-mobile-app/issues"},"homepage":"https://github.com/Captain-Compliance/cc-mobile-app#readme","peerDependencies":{"react":">=18.0.0","react-native":">=0.76.0","react-native-svg":">=13.0.0"},"devDependencies":{"@react-native/eslint-config":"^0.76.0","@testing-library/react-native":"^13.0.0","@types/jest":"^29.5.12","@types/react":"^19.0.2","eslint":"^9.7.0","jest":"^30.0.0","react-native-builder-bob":"^0.40.13","react-native-svg":"^15.13.0","typescript":"^5.5.4"},"exports":{".":{"source":"./src/index.tsx","types":"./lib/typescript/index.d.ts","default":"./lib/module/index.js"},"./package.json":"./package.json"},"react-native-builder-bob":{"source":"src","output":"lib","targets":[["module",{"esm":true}],"typescript"]},"eslintIgnore":["node_modules/","lib/"],"dependencies":{"@react-native-async-storage/async-storage":"^2.2.0"},"_id":"@captaincompliance/cc-mobile-app@1.0.2","gitHead":"e412c0abd9644ed80c6f9e838d6c4541c6584981","_nodeVersion":"22.19.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-me0xVYSG7XX8A2Kl1aIV+lJvTkJD0ynCYh8ksvNW1sBddbjqwcyaaa59DWhdvmZoqVW9MliUU/s8zJDDif+qIQ==","shasum":"d6fb7e04fd27d1c7bbb2e5de50bac5d126af0e01","tarball":"https://registry.npmjs.org/@captaincompliance/cc-mobile-app/-/cc-mobile-app-1.0.2.tgz","fileCount":57,"unpackedSize":82951,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDK1WgUck1aQSOGj4w3ycmPA/uOlCWnFctgjcytFS7n+gIhALAhdcjBXN2vEu2bSekJgmZAHrYg5QULd7j3EEhPxrl+"}]},"_npmUser":{"name":"acnicolasdc","email":"nicolasreyesbejarano@gmail.com"},"directories":{},"maintainers":[{"name":"acnicolasdc","email":"nicolasreyesbejarano@gmail.com"},{"name":"malkady","email":"malkady@gmail.com"},{"name":"alvaropazos","email":"alvaropazos1997@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cc-mobile-app_1.0.2_1758671807036_0.08118657283862118"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-23T22:16:21.435Z","modified":"2025-09-23T23:56:47.459Z","1.0.0":"2025-09-23T22:16:21.746Z","1.0.1":"2025-09-23T23:26:59.787Z","1.0.2":"2025-09-23T23:56:47.231Z"},"bugs":{"url":"https://github.com/Captain-Compliance/cc-mobile-app/issues"},"author":{"name":"Captain Compliance","email":"tu-email@empresa.com"},"license":"MIT","homepage":"https://github.com/Captain-Compliance/cc-mobile-app#readme","keywords":["react-native","npm-package","compliance","mobile","captaincompliance"],"repository":{"type":"git","url":"git+https://github.com/Captain-Compliance/cc-mobile-app.git"},"description":"Paquete React Native para Captain Compliance","maintainers":[{"name":"acnicolasdc","email":"nicolasreyesbejarano@gmail.com"},{"name":"malkady","email":"malkady@gmail.com"},{"name":"alvaropazos","email":"alvaropazos1997@gmail.com"}],"readme":"# 🛡️ Captain Compliance Mobile App\n\n[![npm version](https://badge.fury.io/js/cc-mobile-app.svg)](https://badge.fury.io/js/cc-mobile-app)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/)\n[![React Native](https://img.shields.io/badge/React%20Native-0.76%2B-blue.svg)](https://reactnative.dev/)\n\nA comprehensive React Native library for implementing privacy consent management and GDPR compliance in mobile applications. This library provides a complete solution with customizable consent banners, persistent storage, and seamless integration with the Captain Compliance platform.\n\n## ✨ Features\n\n- 🎯 **Complete Consent Management** - Full GDPR/CCPA compliance solution\n- 🎨 **Fully Customizable UI** - Themeable components with extensive styling options\n- 💾 **Persistent Storage** - Automatic consent persistence with expiration handling\n- 🌐 **API Integration** - Seamless integration with Captain Compliance backend\n- 📱 **Mobile-First Design** - Optimized specifically for React Native\n- 🔒 **TypeScript Support** - Fully typed with comprehensive interfaces\n- ⚡ **Performance Optimized** - Minimal bundle size and efficient rendering\n- 🧪 **Testing Ready** - Built with accessibility and testing in mind\n\n## 📦 Installation\n\n```bash\nnpm install cc-mobile-app\n```\n\n### Peer Dependencies\n\nThis library requires the following peer dependencies:\n\n```bash\nnpm install react react-native react-native-svg @react-native-async-storage/async-storage\n```\n\n## 🚀 Quick Start\n\n### 1. Wrap your app with CaptainComplianceConsent\n\n```tsx\nimport React from 'react';\nimport { CaptainComplianceConsent } from 'cc-mobile-app';\nimport { YourApp } from './YourApp';\n\nexport default function App() {\n  return (\n    <CaptainComplianceConsent \n      token=\"your-captain-compliance-token\"\n      debug={__DEV__}\n      onError={(error) => console.error('Consent Error:', error)}\n    >\n      <YourApp />\n    </CaptainComplianceConsent>\n  );\n}\n```\n\n### 2. Use the consent hook in your components\n\n```tsx\nimport React from 'react';\nimport { View, Text, Button } from 'react-native';\nimport { useCaptainComplianceConsent } from 'cc-mobile-app';\n\nexport function YourComponent() {\n  const { \n    hasConsent, \n    isInitialized, \n    acceptConsent, \n    rejectConsent,\n    resetConsent \n  } = useCaptainComplianceConsent();\n\n  if (!isInitialized) {\n    return <Text>Loading consent settings...</Text>;\n  }\n\n  return (\n    <View>\n      <Text>Consent Status: {hasConsent ? 'Granted' : 'Not Granted'}</Text>\n      <Button title=\"Accept\" onPress={acceptConsent} />\n      <Button title=\"Reject\" onPress={rejectConsent} />\n      <Button title=\"Reset\" onPress={resetConsent} />\n    </View>\n  );\n}\n```\n\n## 📚 API Reference\n\n### CaptainComplianceConsent\n\nThe main provider component that manages consent state and displays consent UI.\n\n#### Props\n\n| Prop | Type | Required | Default | Description |\n|------|------|----------|---------|-------------|\n| `token` | `string` | ✅ | - | Your Captain Compliance API token |\n| `children` | `ReactNode` | ✅ | - | Child components to render |\n| `style` | `StyleConfig` | ❌ | `{}` | Custom styles for consent components |\n| `onError` | `(error: Error) => void` | ❌ | - | Error handler callback |\n| `debug` | `boolean` | ❌ | `false` | Enable debug logging |\n| `manualConsent` | `boolean` | ❌ | `false` | Disable banner by default |\n\n#### Example\n\n```tsx\n<CaptainComplianceConsent\n  token=\"your-token-here\"\n  debug={true}\n  style={{\n    modalContainer: {\n      backgroundColor: 'white',\n      borderRadius: 12,\n      margin: 20,\n    },\n    acceptButton: {\n      backgroundColor: '#007AFF',\n      borderRadius: 8,\n    }\n  }}\n  onError={(error) => {\n    console.error('Consent management error:', error);\n    // Report to your error tracking service\n  }}\n>\n  <YourApp />\n</CaptainComplianceConsent>\n```\n\n### useCaptainComplianceConsent Hook\n\nAccess consent state and actions throughout your app.\n\n#### Returns\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `isInitialized` | `boolean` | Whether the consent system has been initialized |\n| `shouldShowBanner` | `boolean` | Whether the consent banner should be displayed |\n| `hasConsent` | `boolean` | Current consent status |\n| `status` | `ConsentStatus` | Detailed consent status (ACCEPTED, REJECTED, PENDING) |\n| `acceptConsent` | `() => Promise<void>` | Function to accept consent |\n| `rejectConsent` | `() => Promise<void>` | Function to reject consent |\n| `resetConsent` | `() => Promise<void>` | Function to reset consent state |\n| `isReady` | `boolean` | Whether the system is ready for use |\n| `hasErrors` | `boolean` | Whether there are any errors |\n| `lastUpdated` | `Date?` | When consent was last updated |\n| `expiresAt` | `Date?` | When current consent expires |\n\n#### Example Usage\n\n```tsx\nimport { useCaptainComplianceConsent, ConsentStatus } from 'cc-mobile-app';\n\nfunction ConsentSettings() {\n  const { \n    hasConsent, \n    status, \n    lastUpdated, \n    expiresAt,\n    acceptConsent,\n    rejectConsent,\n    resetConsent \n  } = useCaptainComplianceConsent();\n\n  return (\n    <View>\n      <Text>Status: {status}</Text>\n      <Text>Has Consent: {hasConsent ? 'Yes' : 'No'}</Text>\n      {lastUpdated && (\n        <Text>Last Updated: {lastUpdated.toLocaleDateString()}</Text>\n      )}\n      {expiresAt && (\n        <Text>Expires: {expiresAt.toLocaleDateString()}</Text>\n      )}\n      \n      <Button title=\"Accept\" onPress={acceptConsent} />\n      <Button title=\"Reject\" onPress={rejectConsent} />\n      <Button title=\"Reset\" onPress={resetConsent} />\n    </View>\n  );\n}\n```\n\n## 🎨 Customization\n\n### Styling\n\nThe library provides extensive styling options through the `StyleConfig` interface:\n\n```tsx\ninterface StyleConfig {\n  // Modal styles\n  modalOverlay?: ViewStyle;\n  modalContainer?: ViewStyle;\n  closeButton?: ViewStyle;\n  \n  // Content styles\n  content?: ViewStyle;\n  logoContainer?: ViewStyle;\n  logo?: ImageStyle;\n  \n  // Text styles\n  title?: TextStyle;\n  description?: TextStyle;\n  \n  // Button styles\n  buttonContainer?: ViewStyle;\n  acceptButton?: ViewStyle;\n  rejectButton?: ViewStyle;\n  acceptButtonText?: TextStyle;\n  rejectButtonText?: TextStyle;\n  \n  // Floating button\n  floatingButton?: ViewStyle;\n}\n```\n\n### Custom Themes\n\n```tsx\nconst customStyle = {\n  modalContainer: {\n    backgroundColor: '#1a1a1a',\n    borderRadius: 16,\n    margin: 20,\n  },\n  title: {\n    color: '#ffffff',\n    fontSize: 20,\n    fontWeight: 'bold',\n  },\n  description: {\n    color: '#cccccc',\n    fontSize: 16,\n    lineHeight: 24,\n  },\n  acceptButton: {\n    backgroundColor: '#00ff88',\n    borderRadius: 12,\n    paddingVertical: 14,\n  },\n  rejectButton: {\n    backgroundColor: 'transparent',\n    borderWidth: 2,\n    borderColor: '#666666',\n    borderRadius: 12,\n    paddingVertical: 14,\n  },\n  acceptButtonText: {\n    color: '#000000',\n    fontWeight: 'bold',\n  },\n  rejectButtonText: {\n    color: '#ffffff',\n    fontWeight: 'bold',\n  },\n};\n\n<CaptainComplianceConsent\n  token=\"your-token\"\n  style={customStyle}\n>\n  <YourApp />\n</CaptainComplianceConsent>\n```\n\n## 🔧 Configuration\n\n### Environment Setup\n\nThe library automatically determines the API environment based on your configuration. For production, make sure to:\n\n1. Use your production Captain Compliance token\n2. Set `debug={false}`\n3. Implement proper error handling\n\n```tsx\nconst isProduction = process.env.NODE_ENV === 'production';\n\n<CaptainComplianceConsent\n  token={isProduction ? PRODUCTION_TOKEN : DEVELOPMENT_TOKEN}\n  debug={!isProduction}\n  onError={(error) => {\n    if (isProduction) {\n      // Send to error tracking service\n      errorTracker.captureException(error);\n    } else {\n      console.error('Consent Error:', error);\n    }\n  }}\n>\n  <YourApp />\n</CaptainComplianceConsent>\n```\n\n### Storage Configuration\n\nThe library uses AsyncStorage for persistence. Consent data is automatically:\n\n- Stored with token-specific keys\n- Encrypted and secure\n- Automatically expired based on configuration\n- Cleared when consent is reset\n\n## 📱 Components\n\n### ConsentBanner\n\nThe main consent modal that appears when consent is required.\n\n**Features:**\n\n- ✅ Automatic display logic\n- ✅ Customizable text and styling\n- ✅ Logo support\n- ✅ Theme integration\n- ✅ Accessibility support\n- ✅ Close button functionality\n\n### FloatingConsentButton\n\nA floating button that appears when the banner is dismissed but consent is still needed.\n\n**Features:**\n\n- ✅ Configurable positioning\n- ✅ Theme matching\n- ✅ Smooth animations\n- ✅ Accessibility labels\n\n## 🔒 TypeScript Support\n\nThis library is built with TypeScript and provides comprehensive type definitions:\n\n```tsx\nimport type { \n  ConsentContextValue,\n  ConsentStatus,\n  StyleConfig,\n  TextConfig,\n  BannerMobileTokenResponse \n} from 'cc-mobile-app';\n\n// All types are exported and ready to use\nconst handleConsent = (status: ConsentStatus) => {\n  // Fully typed parameters and return values\n};\n```\n\n## 🧪 Testing\n\nThe library is built with testing in mind and includes proper `testID` props and accessibility labels.\n\n### Jest Setup\n\n```tsx\nimport { render } from '@testing-library/react-native';\nimport { CaptainComplianceConsent } from 'cc-mobile-app';\n\n// Mock AsyncStorage for testing\njest.mock('@react-native-async-storage/async-storage', () =>\n  require('@react-native-async-storage/async-storage/jest/async-storage-mock')\n);\n\n// Test your components\ntest('renders consent provider', () => {\n  const { getByTestId } = render(\n    <CaptainComplianceConsent token=\"test-token\">\n      <YourTestComponent />\n    </CaptainComplianceConsent>\n  );\n  \n  // Test your implementation\n});\n```\n\n### Test IDs\n\nThe library provides consistent test IDs:\n\n- `consent-banner` - Main consent modal\n- `consent-banner-logo` - Company logo\n- `consent-banner-accept-button` - Accept button\n- `consent-banner-reject-button` - Reject button\n\n## 🐛 Troubleshooting\n\n### Common Issues\n\n**1. Consent banner not showing**\n\n- Verify your token is valid\n- Check network connectivity\n- Enable debug mode to see detailed logs\n- Ensure AsyncStorage is properly installed\n\n**2. Styling not applying**\n\n- Check that styles follow React Native ViewStyle/TextStyle interfaces\n- Verify style props are passed correctly\n- Use debug mode to inspect component structure\n\n**3. AsyncStorage errors**\n\n- Install `@react-native-async-storage/async-storage`\n- For iOS, run `cd ios && pod install`\n- For Android, rebuild the project\n\n**4. TypeScript errors**\n\n- Ensure you're using TypeScript 4.5+\n- Install `@types/react` and `@types/react-native`\n- Check that all peer dependencies are installed\n\n### Debug Mode\n\nEnable debug mode for detailed logging:\n\n```tsx\n<CaptainComplianceConsent\n  token=\"your-token\"\n  debug={true}\n  onError={(error) => console.error('Debug:', error)}\n>\n  <YourApp />\n</CaptainComplianceConsent>\n```\n\n### Support\n\nFor additional support:\n\n1. Check the [GitHub Issues](https://github.com/Captain-Compliance/cc-mobile-app/issues)\n2. Review the troubleshooting guide above\n3. Contact Captain Compliance support\n\n## 🤝 Contributing\n\nWe welcome contributions! Please see our contributing guidelines:\n\n1. **Fork the repository**\n2. **Create a feature branch**: `git checkout -b feature/amazing-feature`\n3. **Commit your changes**: `git commit -m 'Add amazing feature'`\n4. **Push to the branch**: `git push origin feature/amazing-feature`\n5. **Open a Pull Request**\n\n### Development Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/Captain-Compliance/cc-mobile-app.git\ncd cc-mobile-app\n\n# Install dependencies\nnpm install\n\n# Run type checking\nnpm run lint\n\n# Build the library\nnpm run build\n\n# Run tests\nnpm test\n```\n\n### Code Standards\n\n- Use TypeScript for all new code\n- Follow the existing code style\n- Add tests for new features\n- Update documentation as needed\n- Use conventional commit messages\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🏢 About Captain Compliance\n\nCaptain Compliance provides comprehensive privacy and compliance solutions for modern applications. Our tools help developers build compliant, user-friendly experiences while meeting regulatory requirements like GDPR, CCPA, and more.\n\n**Website:** [https://captaincompliance.com](https://captaincompliance.com)\n**Documentation:** [https://docs.captaincompliance.com](https://docs.captaincompliance.com)\n**Support:** [support@captaincompliance.com](mailto:support@captaincompliance.com)\n\n---\n\nMade with ❤️ by the Captain Compliance team\n","readmeFilename":"README.md"}